当前位置:文档之家› Redis学习笔记整理

Redis学习笔记整理

redis学习笔记整理

一、redis 环境搭建 (2)

二、redis学习笔记之数据类型 (3)

三、redis学习笔记之排序 (11)

四、redis学习笔记之事务 (16)

五、redis学习笔记之pipeline (20)

六、redis学习笔记之发布订阅 (23)

七、redis学习笔记之持久化 (28)

八、redis学习笔记之主从复制 (30)

九、redis学习笔记之虚拟内存 (31)

一、redis 环境搭建

1.简介

redis是一个开源的key-value数据库。它又经常被认为是一个数据结构服务器。因为它的value 不仅包括基本的string类型还有list,set ,sorted set和hash类型。当然这些类型的元素也都是strin g类型。也就是说list,set这些集合类型也只能包含

string 类型。你可以在这些类型上做很多原子性的操作。比如对一个字符value追加字符串(APPEND 命令)。加加或者减减一个数字字符串(INCR命令,当然是按整数处理的).可以对list类型进行push,或者pop元素操作(可以模拟栈和队列)。对于set类型可以进行一些集合相关操作(intersection uni on difference)。memcache也有类似与++,--的命令。

不过memcache的value只包括string类型。远没有redis的value类型丰富。和memcahe一样为了性能。redis的数据通常都是放到内存中的。当然redis可以每间隔一定时间将内存中数据写入到磁盘以防止数据丢失。redis也支持主从复制机制(master-slave replication)。redis的其他特性包括简单的事务支持和发布订阅(pub/sub)通道功能,而且redis配置管理非常简单。还有各种语言版本的开源客户端类库。(https://www.doczj.com/doc/6018885309.html,)

2.安装

下载地址:https://www.doczj.com/doc/6018885309.html,/files/redis-2.0.4.tar.gz

2.0目前是最新稳定版

可以在linux下运行如下命令进行安装

$ tar xzf redis-2.0.4.tar.gz

$ cd redis-2.0.4

$ make

make完后redis-2.0.4目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli

下面启动redis服务.

$./redis-server

注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动.

$ ./redis-server redis.conf

redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了.

比如

$ ./redis-cli

redis> set foo bar

OK

redis> get foo

"bar"

这里演示了get和set命令操作简单类型value的例子。foo是key ,bar是个string类型的value

没linux的可以通过这个在线的来练习,当然在线版的很多管理相关的命令是不支持的。

https://www.doczj.com/doc/6018885309.html,/

3.java客户端hello,world

客户端jar包地址https://www.doczj.com/doc/6018885309.html,/downloads/alphazero/jredis/jredis-1.0-rc2.jar。版

本目前有点老,支持到Redis 1.2.6。最新版2.0的还没release

在eclipse中新建一个java项目,然后添加jredis包引用。下面是个hello,world程序

package jredisStudy;

import org.jredis.*;

import org.jredis.ri.alphazero.JRedisClient;

public class App {

public static void main(String[] args) {

try {

JRedis jr = new JRedisClient("192.168.56.55",6379); //redis服务地址和端口号

String key = "mKey";

jr.set(key, "hello,redis!");

String v = new String(jr.get(key));

String k2 = "count";

jr.incr(k2);

jr.incr(k2);

System.out.println(v);

System.out.println(new String(jr.get(k2)));

} catch (Exception e) {

// TODO: handle exception

}

}

}

好了redis环境已经搭建好了。后面会写写redis的各种类型和类型相关的命令和一些具体的应用场景二、redis学习笔记之数据类型

本文介绍下redis支持的各种数据类型包括string,list ,set ,sorted set 和hash

1. keys

redis本质上一个key-value db,所以我们首先来看看他的key.首先key也是字符串类型,但是key中不能包括边界字符由于key不是binary safe的字符串,所以像"my key"和"mykey\n"这样包含空格和换行的key是不允许的

顺便说一下在redis内部并不限制使用binary字符,这是redis协议限制的。"\r\n"在协议格式中会作为特殊字符。

redis 1.2以后的协议中部分命令已经开始使用新的协议格式了(比如MSET)。总之目前还是把包含边界字符当成非法的key 吧,

免得被bug纠缠。

另外关于key的一个格式约定介绍下,object-type:id:field。比如user:1000:password,blog:xxidxx:title

还有key的长度最好不要太长。道理很明显占内存啊,而且查找时候相对短key也更慢。不过也推荐过短的key,

比如u:1000:pwd,这样的。显然没上面的user:1000:password可读性好。

下面介绍下key相关的命令

exits key 测试指定key是否存在,返回1表示存在,0不存在

del key1 key2 ....keyN 删除给定key,返回删除key的数目,0表示给定key都不存在

type key 返回给定key的value类型。返回none 表示不存在key,string字符类型,list 链表类型set 无序集合类型... keys pattern 返回匹配指定模式的所有key,下面给个例子

redis> set test dsf

OK

redis> set tast dsaf

OK

redis> set tist adff

OK

redis> keys t*

1. "tist"

2. "tast"

3. "test"

redis> keys t[ia]st

1. "tist"

2. "tast"

redis> keys t?st

1. "tist"

2. "tast"

3. "test"

randomkey 返回从当前数据库中随机选择的一个key,如果当前数据库是空的,返回空串

rename oldkey newkey 原子的重命名一个key,如果newkey存在,将会被覆盖,返回1表示成功,0失败。可能是oldk

ey不存在或者和newkey相同

renamenx oldkey newkey 同上,但是如果newkey存在返回失败

dbsize 返回当前数据库的key数量

expire key seconds 为key指定过期时间,单位是秒。返回1成功,0表示key已经设置过过期时间或者不存在

ttl key 返回设置过过期时间的key的剩余过期秒数-1表示key不存在或者没有设置过过期时间

select db-index 通过索引选择数据库,默认连接的数据库所有是0,默认数据库数是16个。返回1表示成功,0失败move key db-index 将key从当前数据库移动到指定数据库。返回1成功。0 如果key不存在,或者已经在指定数据库中flushdb 删除当前数据库中所有key,此方法不会失败。慎用

flushall 删除所有数据库中的所有key,此方法不会失败。更加慎用

2. string 类型

string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象

。从内部实现来看其实string可以看作byte数组,最大上限是1G字节。下面是string类型的定义。

struct sdshdr {

long len;

long free;

char buf[];

};

buf是个char数组用于存贮实际的字符串内容。其实char和c#中的byte是等价的,都是一个字节

len是buf数组的长度,free是数组中剩余可用字节数。由此可以理解为什么string类型是二进制安全的了。因为它本质上就是个byte数组。

当然可以包含任何数据了。另外string类型可以被部分命令按int处理.比如incr等命令,下面详细介绍。还有redis的其他类型像list,set,sorted set ,hash

它们包含的元素与都只能是string类型。

如果只用string类型,redis就可以被看作加上持久化特性的memcached.当然redis对string类型的操作比memcached 多很多啊。如下:

set key value 设置key对应的值为string类型的value,返回1表示成功,0失败

setnx key value 同上,如果key已经存在,返回0 。nx 是not exist的意思

get key 获取key对应的string值,如果key不存在返回nil

getset key value 原子的设置key的值,并返回key的旧值。如果key不存在返回nil

mget key1 key2 ... keyN 一次获取多个key的值,如果对应key不存在,则对应返回nil。下面是个实验,首先清空当前数据库,然后

设置k1,k2.获取时k3对应返回nil

redis> flushdb

OK

redis> dbsize

(integer) 0

redis> set k1 a

OK

redis> set k2 b

OK

redis> mget k1 k2 k3

1. "a"

2. "b"

3. (nil)

mset key1 value1 ... keyN valueN 一次设置多个key的值,成功返回1表示所有的值都设置了,失败返回0表示没有任何值被设置

msetnx key1 value1 ... keyN valueN 同上,但是不会覆盖已经存在的key

incr key 对key的值做加加操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key,则设置key为1

decr key 同上,但是做的是减减操作,decr一个不存在key,则设置key为-1

incrby key integer 同incr,加指定值,key不存在时候会设置key,并认为原来的value是0

decrby key integer 同decr,减指定值。decrby完全是为了可读性,我们完全可以通过incrby一个负值来实现同样效果,

反之一样。

append key value 给指定key的字符串值追加value,返回新字符串值的长度。下面给个例子

redis> set k hello

OK

redis> append k ,world

(integer) 11

redis> get k

"hello,world"

substr key start end 返回截取过的key的字符串值,注意并不修改key的值。下标是从0开始的,接着上面例子

redis> substr k 0 8

"hello,wor"

redis> get k

"hello,world"

3. list

redis的list类型其实就是一个每个子元素都是string类型的双向链表。所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1)

另外list会记录链表的长度。所以llen操作也是O(1).链表的最大长度是(2的32次方-1)。我们可以通过push,pop操作从链表的头部

或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。有意思的是list的pop操作还有阻塞版本的。当我们[lr] pop一个

list对象是,如果list是空,或者不存在,会立即返回nil。但是阻塞版本的b[lr]pop可以则可以阻塞,当然可以加超时时间,超时后也会返回nil

。为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thr ead可以调用阻塞版本的pop去

获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。ok 下面介绍list相关命令

lpush key string 在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是list类型

rpush key string 同上,在尾部添加

llen key 返回key对应list的长度,key不存在返回0,如果key对应类型不是list返回错误

lrange key start end 返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素,key不存在返回空列表

ltrim key start end 截取list,保留指定区间内元素,成功返回1,key不存在返回错误

lset key index value 设置list中指定下标的元素值,成功返回1,key或者下标不存在返回错误

lrem key count value 从key对应list中删除count个和value相同的元素。count为0时候删除全部

lpop key 从list的头部删除元素,并返回删除元素。如果key对应list不存在或者是空返回nil,如果key对应值不是list

返回错误

rpop 同上,但是从尾部删除

blpop key1...keyN timeout 从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在

list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。

当阻塞时,如果有client对key1...keyN中的任意key进行push操作,则第一在这个key上被阻塞的client会立即返回。如果超时发生,则返回nil。有点像unix的select或者poll

brpop 同blpop,一个是从头部删除一个是从尾部删除

rpoplpush srckey destkey 从srckey对应list的尾部移除元素并添加到destkey对应list的头部,最后返回被移除的元素值,整个操作是原子的.如果srckey是空

或者不存在返回nil

4. set

redis的set是string类型的无序集合。set元素最大可以包含(2的32次方-1)个元素。set的是通过hash table实现的,

所以添加,删除,查找的复杂度都是O(1)。hash table会随着添加或者删除自动的调整大小。需要注意的是调整hash tabl e大小时候需要同步(获取写锁)会阻塞其他读写操作。可能不久后就会改用跳表(skip list)来实现

跳表已经在sorted set中使用了。关于set集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),

差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐和blog的tag功能。下面详细介绍set相关命令

sadd key member 添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误

srem key member 从key对应set中移除给定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key对应的不是set类型的值返回错误

spop key 删除并返回key对应set中随机的一个元素,如果set是空或者key不存在返回nil

srandmember key 同spop,随机取set中的一个元素,但是不删除元素

smove srckey dstkey member 从srckey对应set中移除member并添加到dstkey对应set中,整个操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果

key不是set类型返回错误

scard key 返回set的元素个数,如果set是空或者key不存在返回0

sismember key member 判断member是否在set中,存在返回1,0表示不存在或者key不存在

sinter key1 key2...keyN 返回所有给定key的交集

sinterstore dstkey key1...keyN 同sinter,但是会同时将交集存到dstkey下

sunion key1 key2...keyN 返回所有给定key的并集

sunionstore dstkey key1...keyN 同sunion,并同时保存并集到dstkey下

sdiff key1 key2...keyN 返回所有给定key的差集

sdiffstore dstkey key1...keyN 同sdiff,并同时保存差集到dstkey下

smembers key 返回key对应set的所有元素,结果是无序的

5 sorted set

和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score。sorted set的实现是skip list和hash table的混合体

当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1),另一个score到元素的映射被添加到skip list

并按照score排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是O(log(N))和skip list的开销一致,redi s的skip list实现用的是双向链表,这样就

可以逆序从尾部取元素。sorted set最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为score存储,对象的id当元素存储。下面是sorted set相关命令

zadd key score member 添加元素到集合,元素在集合中存在则更新对应score

zrem key member 删除指定元素,1表示成功,如果元素不存在返回0

zincrby key incr member 增加对应member的score值,然后移动元素并保持skip list保持有序。返回更新后的scor e值

zrank key member 返回指定元素在集合中的排名(下标),集合中元素是按score从小到大排序的

zrevrank key member 同上,但是集合中元素是按score从大到小排序

zrange key start end 类似lrange操作从集合中去指定区间的元素。返回的是有序结果

zrevrange key start end 同上,返回结果是按score逆序的

zrangebyscore key min max 返回集合中score在给定区间的元素

zcount key min max 返回集合中score在给定区间的数量

zcard key 返回集合中元素个数

zscore key element 返回给定元素对应的score

zremrangebyrank key min max 删除集合中排名在给定区间的元素

zremrangebyscore key min max 删除集合中score在给定区间的元素

6. hash

redis hash是一个string类型的field和value的映射表.它的添加,删除操作都是O(1)(平均).hash特别适合用于存储对象。相较于将对象的每个字段存成

单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash对象时开始是用zipmap(又称为small hash)来存储的。这个zipmap其实并不是hash table,但是zipmap 相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销。尽管zipmap的添加,删除,查找都是O(n),但

是由于一般对象的field数量都不太多。所以使用zipmap也是很快的,也就是说添加删除平均还是O(1)。如果field或者val ue的大小超出一定限制后,redis会在内部自动将zipmap替换成正常的hash实现. 这个限制可以在配置文件中指定

hash-max-zipmap-entries 64 #配置字段最多64个

hash-max-zipmap-value 512 #配置value最大为512字节

下面介绍hash相关命令

hset key field value 设置hash field为指定值,如果key不存在,则先创建

hget key field 获取指定的hash field

hmget key filed1....fieldN 获取全部指定的hash filed

hmset key filed1 value1 ... filedN valueN 同时设置hash的多个field

hincrby key field integer 将指定的hash filed 加上给定值

hexists key field 测试指定field是否存在

hdel key field 删除指定的hash field

hlen key 返回指定hash的field数量

hkeys key 返回hash的所有field

hvals key 返回hash的所有value

hgetall 返回hash的所有filed和value

三、redis学习笔记之排序

在了解完各种redis类型后,这次介绍下redis排序命令.redis支持对list,set和sorted set元素的排序。排序命令是sort 完整的命令格式如下:

SORT key [BY pattern] [LIMIT start count] [GET pattern] [ASC|DESC] [ALPHA] [STORE dstkey]

下面我们一一说明各种命令选项

(1)sort key

这个是最简单的情况,没有任何选项就是简单的对集合自身元素排序并返回排序结果.下面给个例子

redis> lpush ml 12

redis> lpush ml 11

(integer) 2

redis> lpush ml 23

(integer) 3

redis> lpush ml 13

(integer) 4

redis> sort ml

1. "11"

2. "12"

3. "13"

4. "23"

(2)[ASC|DESC] [ALPHA]

sort默认的排序方式(asc)是从小到大排的,当然也可以按照逆序或者按字符顺序排。逆序可以加上desc选项,想按字母顺序排可以加alpha选项,当然alpha可以和desc一起用。下面是个按字母顺序排的例子

redis> lpush mylist baidu

(integer) 1

redis> lpush mylist hello

(integer) 2

redis> lpush mylist xhan

(integer) 3

redis> lpush mylist soso

(integer) 4

redis> sort mylist

1. "soso"

2. "xhan"

3. "hello"

redis> sort mylist alpha

1. "baidu"

2. "hello"

3. "soso"

4. "xhan"

redis> sort mylist desc alpha

1. "xhan"

2. "soso"

3. "hello"

4. "baidu"

(3)[BY pattern]

除了可以按集合元素自身值排序外,还可以将集合元素内容按照给定pattern组合成新的key,并按照新key中对应的内容进行排序。下面的例子接着使用第一个例子中的ml集合做演示:

redis> set name11 nihao

OK

redis> set name12 wo

OK

redis> set name13 shi

OK

redis> set name23 lala

OK

redis> sort ml by name*

1. "13"

2. "23"

3. "11"

4. "12"

*代表了ml中的元素值,所以这个排序是按照name12 name13 name23 name23这四个key对应值排序的,当然返回的还是排序后ml集合中的元素

(4)[GET pattern]

上面的例子都是返回的ml集合中的元素。我们也可以通过get选项去获取指定pattern作为新key对应的值。看个组合起来的例子

redis> sort ml by name* get name* alpha

1. "lala"

2. "nihao"

3. "shi"

4. "wo"

这次返回的就不在是ml中的元素了,而是name12 name13 name23 name23对应的值。当然排序是按照name12 na me13 name23 name23值并根据字母顺序排的。另外get选项可以有多个。看例子(#特殊符号引用的是原始集合也就是ml)

redis> sort ml by name* get name* get # alpha

1. "lala"

2. "23"

3. "nihao"

4. "11"

5. "shi"

6. "13"

7. "wo"

8. "12"

最后在还有一个引用hash类型字段的特殊字符->,下面是例子

redis> hset user1 name hanjie

(integer) 1

redis> hset user11 name hanjie

redis> hset user12 name 86

(integer) 1

redis> hset user13 name lxl

(integer) 1

redis> sort ml get user*->name

1. "hanjie"

2. "86"

3. "lxl"

4. (nil)

很容易理解,注意当对应的user23不存在时候返回的是nil

(5) [LIMIT start count]

上面例子返回结果都是全部。limit选项可以限定返回结果的数量。例子

redis> sort ml get name* limit 1 2

1. "wo"

2. "shi"

start下标是从0开始的,这里的limit选项意思是从第二个元素开始获取2个

(6)[STORE dstkey]

如果对集合经常按照固定的模式去排序,那么把排序结果缓存起来会减少不少cpu开销.使用store选项可以将排序内容保存到指定key中。保存的类型是list

redis> sort ml get name* limit 1 2 store cl

(integer) 2

list

redis> lrange cl 0 -1

1. "wo"

2. "shi"

这个例子我们将排序结果保存到了cl中

功能介绍完后,再讨论下关于排序的一些问题。如果我们有多个redis server的话,不同的key可能存在于不同的s erver上。比如name12 name13 name23 name23,很有可能分别在四个不同的server上存贮着。这种情况会对排序性能造成很大的影响。redis作者在他的blog上提到了这个问题的解决办法,就是通过key tag将需要排序的key都放到同一个server上。由于具体决定哪个key存在哪个服务器上一般都是在client端hash的办法来做的。我们可以通过只对key 的部分进行hash.举个例子假如我们的client如果发现key中包含[]。那么只对key中[]包含的内容进行hash。我们将四个name相关的key,都这样命名[name]12 [name]13 [name]23 [name]23,于是client 程序就会把他们都放到同一se rver上。不知道jredis实现了没。

还有一个问题也比较严重。如果要sort的集合非常大的话排序就会消耗很长时间。由于redis单线程的,所以长时间的排序操作会阻塞其他client的请求。解决办法是通过主从复制机制将数据复制到多个slave上。然后我们只在slave上做排序操作。并进可能的对排序结果缓存。另外就是一个方案是就是采用sorted set对需要按某个顺序访问的集合建立索引。四、redis学习笔记之事务

redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。一般情况下redis在接受到一个cl ient发来的命令后会立即处理并返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就结束事务上下文。下面可以看一个例子redis> multi

OK

redis> incr a

QUEUED

QUEUED

redis> exec

1. (integer) 1

2. (integer) 1

从这个例子我们可以看到incr a ,incr b命令发出后并没执行而是被放到了队列中。调用exec后俩个命令被连续的执行,最后返回的是两条命令执行后的结果

我们可以调用discard命令来取消一个事务。接着上面例子

redis> multi

OK

redis> incr a

QUEUED

redis> incr b

QUEUED

redis> discard

OK

redis> get a

"1"

redis> get b

"1"

可以发现这次incr a incr b都没被执行。discard命令其实就是清空事务的命令队列并退出事务上下文。

虽说redis事务在本质上也相当于序列化隔离级别的了。但是由于事务上下文的命令只排队并不立即执行,所以事务中的写操作不能依赖事务中的读操作结果。看下面例子

redis> multi

OK

redis> get a

QUEUED

redis> get b

QUEUED

redis> exec

1. "1"

2. "1"

发现问题了吧。假如我们想用事务实现incr操作怎么办?可以这样做吗?

redis> get a

"1"

redis> multi

OK

redis> set a 2

QUEUED

redis> exec

1. OK

redis> get a,

"2"

结论很明显这样是不行的。这样和get a 然后直接set a是没区别的。很明显由于get a 和set a并不能保证两个命令是连续执行的(get操作不在事务上下文中)。很可能有两个client同时做这个操作。结果我们期望是加两次a从原来的1变成3.但是很有可能两个client的get a,取到都是1,造成最终加两次结果却是2。主要问题我们没有对共享资源a的访问进行任何的同步

也就是说redis没提供任何的加锁机制来同步对a的访问。

还好redis 2.1后添加了watch命令,可以用来实现乐观锁。看个正确实现incr命令的例子,只是在前面加了watch a

redis> watch a

OK

redis> get a

"1"

redis> multi

OK

redis> set a 2

QUEUED

redis> exec

1. OK

redis> get a,

"2"

watch 命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用w atch多次监视多个key.这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然了exec,discard,unwatch命令都会清除连接中的所有监视.

redis的事务实现是如此简单,当然会存在一些问题。第一个问题是redis只能保证事务的每个命令连续执行,但是如果事务中的一个命令失败了,并不回滚其他命令,比如使用的命令类型不匹配。

redis> set a 5

OK

redis> lpush b 5

(integer) 1

redis> set c 5

OK

redis> multi

OK

redis> incr a

QUEUED

redis> incr b

QUEUED

redis> incr c

QUEUED

redis> exec

1. (integer) 6

2. (error) ERR Operation against a key holding the wrong kind of value

3. (integer) 6

可以看到虽然incr b失败了,但是其他两个命令还是执行了。

最后一个十分罕见的问题是当事务的执行过程中,如果redis意外的挂了。很遗憾只有部分命令执行了,后面的也就被丢弃了。当然如果我们使用的append-only file方式持久化,redis会用单个write操作写入整个事务内容。即是是这种方式还是有可能只部分写入了事务到磁盘。发生部分写入事务的情况下,redis重启时会检测到这种情况,然后失败退出。可以使用re dis-check-aof工具进行修复,修复会删除部分写入的事务内容。修复完后就能够重新启动了。

五、redis学习笔记之pipeline

redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下

Client: INCR X

Server: 1

Client: INCR X

杨忠《语言学概论》笔记

Chapter 1 Introduction Ⅰ.What is language? 1. Different definitions of language (1) Language is a system whose parts can and must be considered in their synchronic solidarity. (de Saussure, 1916) (2) [Language is] a set (finite or infinite) of sentences, each finite in length and constructed out of a finite set of elements. (Chomsky, 1957) (3) Language is a purely human and non-instinctive method of communicating ideas, emotions and desires by means of voluntarily produced symbols. 2. Each of the definitions above has pointed out some aspects of the essence of language, but all of them have left out something. We must see the multi-faceted nature of language. 3. As is agreed by linguists in broad terms, language can be defined as a system of arbitrary vocal symbols used for human communication. Ⅱ.Features of human language 1. Creativity (1) Language provides opportunities for sending messages that have never been sent before and for understanding brand new messages. (2) The grammar rules and the words are finite, but the sentences are infinite. Every speaker uses language creatively. 2. Duality (1) Language contains two subsystems, one of sounds and the other of meanings. (2) Certain sounds or sequences of sounds stand for certain meanings. (3) Certain meanings are conveyed by certain speech sounds or sequences of speech sounds. 3. Arbitrariness (1) The relationship between the two subsystems of language is arbitrary. (2) There is no logical connection between sound and meaning. 4. Displacement (1) There is no limit in time or space for language. (2) Language can be used to refer to things real or imagined, past, present or future. 5. Cultural transmission (1) Culture cannot be genetically transmitted. Instead, it must be learned. (2) Language is a way of transmitting culture. 6. Interchangeability All members of a speech community can send and receive messages. 7. Reflexivity (1) Human languages can be used to describe themselves. (2) The language used to talk about language is called meta-language. Ⅲ.Functions of language – three meta-functions 1. The ideational function

2017山香教育理论基础整理笔记(教育学、心理学、教育心理学)

第一章教育与教育学 1、《学记》——“教也者,长善而救其失者也” 2、战国时荀子——“以善人者谓之教” 3、许慎在《说文解字》中认为“教,上所施,下所效也。”“育,养子使作善也。” 4、最早将“教育”一词连用的则是战国时期的孟子:“得天下英才而教育之,三乐也。” 5、分析教育哲学的代表人物谢弗勒在《教育的语言》中把教育定义区分为三种: 规定性定义:作者自己认为的定义,即不管他人使用的“教育”的定义是什么,我认为“教育”就是这个意思。运用规定性定义虽然有一定的自由度,但是,要求作业在后面的论述和讨论中,前后一贯地遵守自己的规定。 描述性定义:回答“教育实际上是什么”的定义。尽量不夹杂自己的主观看法,适当地对术语或者使用该术语的方法进行界定。 纲领性定义:回答“教育应该是什么”的定义。即通过明确或隐含的方式告诉人们教育应该是什么或者教育应该怎么样。 6、教育是一种活动。“教育”是以一种“事”的状态存在,而不是以一种“物”的状态出现。因而。我们就把“活动”作为界定教育的起点。 7、教育活动是人类社会独有的活动。 8、“生物起源论”代表人物: 利托尔诺在《各人种的教育演变》中指出教育是超出人类社会以外的,在动物界中就存在的。 沛西·能在《教育原理》中也认为教育是一个生物学过程,扎根于本能的不可避免的行为。 9、“终身教育”概念的提出,指明人在生理成熟后仍继续接受教育。 10、社会性是人的教育活动与动物所谓“教育”活动的本质区别。 11、教育的本质:教育活动是培养人的社会实践活动。 12、教育是人类通过有意识地影响人的身心发展从而影响自身发展的社会实践活动。 13、学校教育是一种专门的培养人的社会实践活动。 14、学校教育自出现以来就一直处于教育活动的核心。 15、学校教育是由专业人员承担的,在专门机构——学校中进行的目的明确、组织严密、系统完善、计划性强的以影响学生身心发展为直接目标的社会实践活动。 16、学校教育的特征:①可控性②专门性③稳定性 17、教育概念的扩展——大教育观的形成 18、1965年,法国教育家保罗·朗格朗在《终身教育引论》中指出,教科文组织应赞同“终身教育”的原则。 19、1972年,埃德加·富尔在《学会生存》中对“终身教育”加以确定,并提出未来社会是“学习化社会”。 20、“终身教育”概念以“生活、终身、教育”三个基本术语为基础。 从时间上看,终身教育要求保证每个人“从摇篮到坟墓”的一生连续性的教育过程; 从空间上看,终身教育要求利用学校、家庭、社会机构等一切可用于教育和学习的场所; 从方式上看,终身教育要求灵活运用集体教育、个别教育、面授或远距离教育; 从教育性质上看,终身教育即要求有正规的教育与训练,也要求有非正规的学习和提高,既要求人人当先生,也要求人人当学生。 21、教育的形态,是指教育的存在特征或组织形式。 22、在教育发展史上,教育的形态经历了从非形式化到形式化,再到制度化教育的演变。

语言学概论整理

语言学概论 第一章、绪论 1.语言学定义:专门以语言为研究对象的一门独立的科学。语言学的任务就是研究语言的性质、功能、结构及其运用等问题,揭示语言存在和发展的规律,使人们理解并掌握语言的理性知识。 第一节、语言研究与语言学 1.神话传说 2.语文学研究 ①语文学:是从文献角度研究语言文字学科的总称。它以文献评审为主,目的在于解释、 注疏和考订。 ②东方语言学:古印度、古中国 古印度语言学:公元前4、5世纪时,口语和《吠陀》时代的语言差别越来越大,甚至许多地方已经不能为一般人所读懂了。为了确保准确无误地理解《吠陀》的宗教内容,就必须对《吠陀》的语言作注释。著名的《巴尼尼经》(Pāninisūtra)正是当时从解说《吠陀》语言开始,进而研究梵语的整个结构的产物。《巴尼尼经》又名《八章书》,是巴尼尼在前人研究的基础上撰写的一部梵语语法。巴尼尼用3,983条经句极其概括地叙述了梵语的语音结构、语词的构成和变化规则。巴尼尼语法是一部汇集了许多世纪的语法学家研究成果的语法法典,对梵语的语音、语法现象分析和描写得十分细致,代表了古代印度语言研究的水平。印度语言研究的最初动力,是必须把梵语文化中最古老的吠陀时期由口头流传下来的一些宗教和礼仪文献保存下去,巴尼尼的工作在一定程度上帮助了后人学习和研究梵语。布龙菲尔德说:巴尼尼的著作是“人类智慧的丰碑之一”。 ③西方语言学:古希腊语言学、古罗马语言学、中世纪至18世纪末的西方语言学 谈谈语文学和语言学的关系: 语言学就是专门以语言为研究对象的一门独立的科学。语言学的任务就是研究语言的性质、功能、结构及其运用等问题,揭示语言存在和发展的规律,使人们理解并掌握语言的理性知识。语言学还没有成为一门独立的学科之前,人们对于语言的学习和研究只是为了给古代经典文献作注释,我们称那段时期的语言研究为语文学。语文学是从文献角度研究语言文字学科的总称。它以文献评审为主,目的在于解释、注疏和考订。 3.历史比较语言学:威廉琼斯的论文拉开19世纪历史比较语言学研究的序幕 4.现代语言学: ①瑞士语言学家索绪尔的《普通语言学教程》 索绪尔:现代语言学的历史,是从瑞士语言学家费尔迪南·德·索绪尔开始的。索绪尔的代表作是《普通语言学教程》。索绪尔被誉为“现代语言学之父”,《普通语言学教程》是现代语言学的奠基之作。索绪尔的语言学思想和19世纪以前的语文学最根本的区别在于:把语言看成是由各个符号之间的关系组成的有价值的结构系统。 《普通语言学课程》是一部什么样的书? 《普通语言学教程》是由索绪尔的两位弟子兼同事根据学生们的听课笔记整理而成的。《普通语言学教程》是现代语言学的奠基之作。索绪尔区分了语言和言语,语言属于全社会,是抽象的;言语属于个人,是具体的。索绪尔认为语言是符号系统,“是一个纯粹的价值系统”。每个符号是由“能指”和“所指”构成的,所指和能指之间的关系是任意的。符号之间存在着线性的句段关系和联想的聚合关系。索绪尔把语言现象分为“共时”和“历时”两种,“共时”是指时间历程中的某一点上的语言状态,“历时”是指以时间历程中的某一点到以后的语言现象。索绪尔认为,语言学的对象是语言,由于语言有它的内部要素,也有它的外部要素,所以语言学也可以分为内部语言学和外部语言学。总之,《普通语言学教程》的语言学

教育学笔记整理版

教育学笔记 教育与教育学 教育的发展 一、教育的概念 教育一词最早出现在《孟子·尽心上》 广义的教育包括家庭教育、学校教育、社会教育。 狭义的教育指学校教育 二、教育的构成要素 教育者:教师是学校教育的主体,在教育过程中发挥主导作用。 受教育者:学生是教育实践活动的对象及学习的主体。 教育影响:教育影响是教育内容、教育方法和教育手段极其联系的总和。 在这三个基本要素中,受教育者和教育内容之间的矛盾是教育中的基本的决定性的矛盾。 三、教育的属性 本质属性:教育是一种有目的的培养人的社会活动。 社会属性:永恒性、历史性、相对独立性、继承性、阶级性。 四、教育功能的分类及教育的个体功能

教育起源的相关学说:

综观古代学校教育,其共同特征是: 1.教育与生产劳动想脱离; 2.教育具有阶级性和等级性 3.教育内容偏重于人文知识,教学方法倾向于自学、对辩和死记硬背。 接下来我们用两张思维导图来记忆近代社会的教育和现代社会的教育: 通过之前的笔记,我们了解了教育发展的历史形态,那世界教育改革的趋势又是什么呢?我们接着往下看:

教育学的研究对象及其发展状况。 首先我们来思考一下,教育的研究对象是什么呢? 那么我们先要了解一下教育学的定义: 教育学是研究教育现象和教育问题,揭示教育规律的一门社会科学。 什么是教育现象呢? 教育现象是教育活动的外在的、表面的特征,包括教育社会现象和教育认识现象。 什么是教育规律呢? 教育规律是教育内部诸因素之间、教育与外部诸因素之间内在、本质、必然的联系。 其次我们来思考一下,教育学的研究任务是什么呢? 教育学的研究任务是阐明教育的基础知识和基本理论,揭示教育教学的基本规律,给教育理论和实践工作者以理论和方法的指导,全面提高教育教学质量,为培养合格的人才服务。这句话比较长,也比较拗口,聪明的你记住了吗? 接下来我们再来看一下教育学和几个概念的联系和区别: 教育学不等于教育方针政策,但二者之间是有联系的,教育方针政策的制定要考虑教育学所阐述的教育科学理论,教育学也要围绕教育方针政策提出的问题、课题,开展科学的研讨和探讨,提供可供参考的意见。 教育学源于教育实践经验,又高于教育实践经验。教育实践经验是学习、研究、发展教育学的基础之一。 教育学是庞大教育科学体系中的基础学科。 教育学的价值与意义: 1.有助于树立正确的教育思想,提高贯彻社会主义教育方针、政策的自觉性。 2.有利于巩固热爱教育事业的专业思想,全面提高教师的素质。 3.有助于认识和掌握教育规律,提高从事教育工作的水平和能力。 4.有助于推动教育改革和教育科学研究。

世界史读书笔记

世界史读书笔记 导语:在中国出土的青铜器也很多,铜与锡来自何处?走笔至此,想起一个中国城市,名叫无锡,市内还有一山,名叫锡山,这是很有意思的。以下小编为大家介绍世界史读书笔记文章,仅供参考! 世界史读书笔记在一个偶然的机会下我阅读了《失落的国度》这本书。西琴这部《失落的国度》,探讨的主要是印第安文明与苏美尔文明之间关系。他认为美洲的文明仍然只是苏美尔文明在美洲的一个分支,同样是由阿努纳奇人建立的。他非常精确地将阿努纳奇人到达美洲的时间定在了公元前3113年,这是玛雅最后一个纪元开始的时间。这些来自中东蓄须人来到这里,他们的目标只有一个,即是挖矿,一个是金矿,一个是锡矿。前者用于解救尼比鲁星的生态危机,这也是阿努们来到地球的主要目标;后者则用于制造青铜器。其实人类采用青铜本身就是件很奇怪的事,在不知金属冶炼为何物之时,竟能掌握复杂的青铜冶炼工艺,且在全世界遍地开花,真是够神奇的。人类对于工具的采用,一般先是从简单的、容易得到的、不脱离自然形态的物件开始,像青铜这样如此复杂,需要融化两种金属,还得按照一定比例的合金,人类会进行长久的探索才能得到。人类却尚在蒙昧时期,刚从石器时代进入金融时代,就得到如此坚硬

的合金,如无外力的帮助,是令人难以想象的。 在中国出土的青铜器也很多,铜与锡来自何处?走笔至此,想起一个中国城市,名叫无锡,市内还有一山,名叫锡山,这是很有意思的。无锡何以名,最流行的一种说法是此地本产锡,一直开采到汉代,锡矿枯竭,是称无锡。无论如何,无锡与锡有关是基本可以定论的,且现在无锡确已无锡。难道此处之锡都用作制作青铜去了吗?中国还有一处盛产锡,那就是云南的个旧,现在仍然还在产。吊诡的是,此两处皆非中国青铜文化的中心,而是处于边缘地带,作为青铜文化中心的中原,则并不产铜与锡。那么就有一个问题,这些矿石是如何运至中原的?想想当时的运输条件,真是个艰巨的工程。当然,这是题外话。不过,如果有人做一点研究,会取得很有趣的成果的。 回过头来再说《失落的国度》。书中还有一处让我感触颇深的是美洲的巨石文化,随处可见的石制建筑,很是让人惊叹。特别是在蒂华纳科,这座位于的的喀喀湖边的神秘高原之城,巨大而坚硬的石头像豆腐一样,被人任意地切割,砌成各式各样的形状,堪称鬼斧神工。即使以现今的技术,亦不一定能达成。那么数千年前的印第安人,是以何种手段做到的呢?总不会像现在一些研究者认为的,也如埃及金字塔那样,是由数以十万计的平民,以肩挑背扛的方式,一点一点地砌成的吧?其实,类似的奇迹在美洲这块神秘的大陆

Redis面试专题及答案

redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高? 区别: 1.mc可缓存图片和视频。rd支持除k/v更多的数据结构; 2.rd可以使用虚拟内存,rd可持久化和aof灾难恢复,rd通过主从支持数据备份; 3.rd可以做消息队列。 原因:mc多线程模型引入了缓存一致性和锁,加锁带来了性能损耗。 redis主从复制如何实现的?redis的集群模式如何实现?redis的key是如何寻址的? 主从复制实现:主节点将自己内存中的数据做一份快照,将快照发给从节点,从节点将数据恢复到内存中。之后再每次增加新数据的时候,主节点以类似于mysql的二进制日志方式将语句发送给从节点,从节点拿到主节点发送过来的语句进行重放。 分片方式: -客户端分片 -基于代理的分片 ●Twemproxy ●codis -路由查询分片 ●Redis-cluster(本身提供了自动将数据分散到Redis Cluster不同节点的能力,整个数据集合的某个数据子集存储在哪个节点对于用户来说是透明的) redis-cluster分片原理:Cluster中有一个16384长度的槽(虚拟槽),编号分别为0-16383。每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,可以由用户指定,也可以在初始化的时候自动生成,只有Master才拥有槽的所有权。Master节点维护着一个16384/8字节的位序列,Master节点用bit来标识对于某个槽自己是否拥有。比如对于编号为1的槽,Master只要判断序列的第二位(索引从0开始)是不是为1即可。这种结构很容易添加或者删除节点。比如如果我想新添加个节点D, 我需要从节点A、B、C中得部分槽到D上。 使用redis如何设计分布式锁?说一下实现思路?使用zk可以吗?如何实现?这两种有什么区别? redis: 1.线程A setnx(上锁的对象,超时时的时间戳t1),如果返回true,获得锁。 2.线程B 用get获取t1,与当前时间戳比较,判断是是否超时,没超时false,若超时执行第3步; 3.计算新的超时时间t2,使用getset命令返回t3(该值可能其他线程已经修改过),如果 t1==t3,获得锁,如果t1!=t3说明锁被其他线程获取了。 4.获取锁后,处理完业务逻辑,再去判断锁是否超时,如果没超时删除锁,如果已超时,不用处理(防止删除其他线程的锁)。 zk: 1.客户端对某个方法加锁时,在zk上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点node1; 2.客户端获取该路径下所有已经创建的子节点,如果发现自己创建的node1的序号是最小的,就认为这个客户端获得了锁。 3.如果发现node1不是最小的,则监听比自己创建节点序号小的最大的节点,进入等待。

高等教育学复习整理笔记

高等教育:就是在完全得中等教育基础上进行得各种学术性、专业性教育,就是培养各类高级专门人才得社会活动。 高等教育学:就是一门以高等教育得运行形态与发展基本规律为研究对象得具有综合性、理论性与应用性得教育科学。 高等教育结构:指高等教育内部各要素之间得构成状态与比例关系,它就是一个多维度多层次得复杂得综合结构。其构成主要包括:体制结构、形式结构、层次结构、科类结构、能级结构、地区结构(即布局)等。 教育方针:就是国家在一定得历史时期,根据社会政治经济发展得需要,通过一定得立法程序为教育事业确立得总得工作方向与奋斗目标,就是教育政策得总概括,其内容包括教育指导思想,教育目得以及实现教育目得得基本途径,就是一切教育工作营遵循得基本指针。如果就是简答题,还应加上:2002年11月党得十六大又明确指出:“全面贯彻党得教育方针,坚持教育为社会主义现代化建设服务,为人民服务,与生产劳动与社会实践相结合,培养德智体美全面发展得社会主义建设者与接班人。” 教育目得:具体而言就就是指按一定社会得要求把接受过完全中等教育得人培养成为一定社会所需要得高级专门人才。《中华人民共与国高等教育法》对我国高等教育得目得作了如下规定:“高等教育必须贯彻国家得教育方针,为社会主义现代化建设服务,与生产劳动相结合,使受教育者成为德、智、体、美等方面全面发展得社会主义事业得建设者与接班人。” 高等教育管理体制:就是指与高等教育管理活动有关得组织制度体系,它主要包括高等教育组织机构得设置、组织机构间得隶属关系,以及相互间职责、权限得划分等等。从本质上来讲,它实际体现了国家在高等教育管理活动中得中央与地方政府、政府与高校以及高校各管理层次、管理单元之间得职责、权利与利益关系。前两者通常被称为高等教育得宏观管理体制,后者则称为高等教育得微观管理体制,又被称为高等学校得管理体制。 高等学校管理体制:就是指高等教育管理体制得微观层次,主要指高校管理体制中校各管理层次、管理单元之间得职责、权利与利益关系,即高校内部得管理。(这个概念较“高等教育管理体制”重要) 高等学校学制:指各类各层次高等学校得系统,它就是一个国家整个学校教育制度得一个组成部分。 学位制度:就是国家与高校为保证学位得严肃性,通过建立明确得学术衡量标准与严格得学位授予程序,而对达到相应学术水平得受教育者授予一定称号得制度。 专业:就是高等学校根据社会专业分工需要与学科体系得内在逻辑而划分得学科门类。 专业特色:就是指所办专业得优长之处、特殊之点。主要体现在专业得构成要素与培养方式方面,最终表现为专业造就得“产品”——大学生在社会中得适应性与竞争力上。 课程:课程有狭义与广义之分,狭义得课程就是指被列入教学计划得各种科目及其在教学计划中得地位与开设顺序得总与。广义得课程就是指为实现高教目得与专业培养目标而设计得教学科目、结构及其进程与结果,就是为学生得全面发展而设计得一切条件与一切活动得总与。 教学大纲:就是指课程教学大纲,就是以系统与连贯得形式,按章节、条目、基本论点与进程叙述该课程主要内容得教学指导文件。

世界现代史读书笔记

世界史读书笔记 书名:《发现——二战中的谜团真相》 学生姓名:易丹 年级:2010级 学院:历史文化学院 专业:历史教育 班级:2班 学号:2010030238

读书笔记 ——《发现——二战中的谜团真相》 秦叔宝(原名陈孝威著章节大意: 第一章:天上的会议室——决战秘闻 揭秘协约国主要领导人在会议桌上的决策,一个个决定着千万人生死的决议从他们手上悄无声息的发出。这是个没有硝烟的战场,这是智慧的较量。 第二章:地下的发报机——间谍秘史 讲诉二战时期各国间谍的英雄史诗,他们的身份、任务、贡献大揭密。第三章:幕布后面的枪声——战役内幕 揭秘二战中几大著名事件的历史真相,抛开人们惯常所知的,展现给你不为人知的一面。 第四章:铁甲威龙——武器揭秘 揭秘二战中各种特种武器大揭密,高科技、高威力、高价值的新型武器,从核潜艇到航母再到超级密码、电子对抗等等,讲诉很多我们所不知道的核武器的故事。 第五章:将帅终结者——将帅之死

讲诉二战中主要的战争罪犯、日德意领导人以及主要将领的死亡秘密,揭秘他们最后生命的内幕。 第六章:谁动了我的黄金——藏金之谜 揭秘二战中同盟国大量的财富的来源以及去处。 第七章:加里森赶死队——特种部队 揭秘二战中各种特种兵作战情况,他们对战争的贡献以及他们的最终归宿。 第八章:爱因斯坦的沉默——核秘闻 讲诉二战中核研究的各种秘闻,揭秘美国“曼哈顿工程”、爱因斯坦的功过以及美对日广岛、长崎投原子弹的最终原因。 第九章:枪炮上的玫瑰——花边故事 揭秘二战中各国领导人的绯闻趣事。 文章线索: 本书以谜团为线索,对二战中的秘密进行描述,本书强调谜团更强调真相。本书从九个方面对涉及二战中的诸多鲜为人知的事实进行了详尽的描述,以记录的方式呈现了二战中的谜团极其真相。 观感:

Redis的5个常见使用场景

Redis的5个常见使用场景概括 大家平时在使用Redis的时候有没有总结过Redis常用于哪些场景呢。下面科多老师带着大家一起来总结一下,希望能够帮助到各位同学。 1、会话缓存(Session Cache) 最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis 缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗? 幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis 来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。 2、全页缓存(FPC) 除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性 问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。 再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。 此外,对WordPress的用户来说,Pantheon有一个非常好的插件wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。 3、队列 Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis 能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。 如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这 里去查看。 4、排行榜/计数器 Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set) 和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可: 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行: ZRANGE user_scores 0 10 WITHSCORES

语言学概论00541史上最全(吐血整理) 汇总 简单题+名词解释 小抄笔记

27.书面语:书面语是用文字记录的语言形式,它是文字产生或在口语的基础上产生的,书面语是经过加工、提炼和发展了的口语的书面形式。 26.口语:就是有声的口头语言,任何一种语言都有口头存在形式。它是书面产生的基础。 28.语言相关论:语言相关论是萨丕尔和沃尔夫提出的关于语言与思维关系的观点,主张语言决定思维,不同的语言就有不同的思维方式。 29.大脑语言功能临界期:大脑语言功能临界期是指大脑的单侧化,大脑左半球的分区以及语言的遗传机制,都只提供人具有语言能力的潜在可能性,这些潜能必须在一定期限内被一定的语言环境激活才可能起作用。26.语言符号的所指 :语言符号的所指是符号的形式所指的意义内容。 29.机器翻译:通过计算机把一种语言自动翻译成另一种或多种自然语言的信息处理技术。 26.语音:语音是人的发音器官发出的、用于人与人之间交际并表达一定意义的声音。 27.词:词是最小的、有意义的、能够独立运用的语言单位。 28.语用:语用指语言运用,即人们在一定的交际环境中对语言的实际运用。 29.文字:文字是记录语言的书写符号系统。 27.单纯词:单纯词是由一个构词语素构成的词。 29.屈折:屈折是通过词的内部发生语音的交替变换来改变词的语法意义的手段。 28.意译词:是用本族语言的构词材料和规则构成新词,把外语中某个词的意义翻译过来。 27.仿译词:是用本族语言的语素逐个对译外语原词的语素造成的词,它不仅把原词的词义翻译过来,而且保持了原词的内部构成方式。 29.主谓词组:两个成分之间具有被说明和说明关系的词组是主谓词组。 27.复辅音:一个音节内处于同一个肌肉紧张的渐强阶段或渐弱阶段上的两个或两个以上辅音的组合。 27.双语现象:某一言语社团使用两种或多种语言的社会现象,具体而言是社团内的全体成员或部分成员双语并用的现象。 28.亲属语言:从同一种语言中分化出来的各个语言叫亲属语言,亲属语言之间具有历史同源关系。 26.调位:利用音节内的音高差别来起辩义作用的语音单位叫做调位,调位是一种非音质音位,依附在音位的组合序列上。 29.词组:实词与实词之间具有直接联系的相对独立的词群。 28.语素:语素是语言中音义结合的最小单位。 28.词尾:附着在词干后的,能改变词的语法形式,但不能构成新词的语素。 29.语素:音义结合的最小语言单位。 26.词类:词类是词在语法上的分类。它指可以替换出现在语法结构某些共同组合位置上的词的类,即具有聚合关系的词的类。 27.词法:(1)词法主要描写词的形态特征和词形变化规则。例如,俄语的名词在形式上有单数和复数的区别,有阳性、阴性、中性等性的区别,有主格、宾格、属格等格的区别,这些都是典型的词法现象。(2)由于印欧语言中构词单位、构词方式和词类都与词的形态变化相关,因此构词和词类问题也成为词法的一部分。27.语法意义:语法意义是语法形式所体现的意义,是语言中通过一类形式或功能所获得的意义。二者相辅相成,不可分离。如“动词+名词”有动宾关系的意义,汉语所有的同类组合都是如此,这种意义就是一种语法意义。 27.语法形式:语法形式就是能体现表达某种语法意义的形式。表示某一类语法意义或者有共同作用的形式,如词类形式、组合形式、虚词形式,就是语法形式。语法形式不是个别的语音形式和词语形式,但能产生某一类意义或者有共同作用的语音表现形式或者词形变化形式也是语法形式。 27.语法手段:根据语法形式的共同特点所归并的语法形式的基本类别叫做语法手段。语法手段可分为词法手段和句法手段两大类。通过词形的变化来表现语法意义的形式是词法手段;通过结构的变化来表现语法意义的形式是句法手段;例如英语名词后加s表示复数,英语动词后面加ed表示过去时,就是词法手段中的词形变化。 28.自源文字:自源文字指独立发展起来的文字。如古埃及文字、苏美尔文字、汉字,这些文字的形体、体系都是由最早使用该文字的人们独创的。 29.语音合成(1)语音合成是语音信息处理研究中的主要工作。 (2)语音合成就是让计算机模拟人的发音器官的动作并发生类似的声音。如汉语的语音合成目前已初步实现自动生成声韵调结合的音节。 26.句子:句子是词或词组按一定规则组合成的、能表达相对完整的意义、前后有较大停顿并带有一定的语气和句调的语言单位。 27.异化:语流中两个相同或相近的音,其中一个因受另一个影响而变得不相同或不相近。

语言学概论(笔记整理)

. What is language? “Language is system of arbitrary vocal symbols used for human communication. It is a system, since linguistic elements are arranged systematically, rather than randomly. Arbitrary, in the sense that there is usually no intrinsic connection between a work (like “book”) and the object it refers to. This explains and is explained by the fact that different languages have different “books”: “book” in English, “livre” in French, in Japanese, in Chinese, “check” in Korean. It is symbolic, because words are associated with objects, actions, ideas etc. by nothing but convention. Namely, people use the sounds or vocal forms to symbolize what they wish to refer to. It is vocal, because sound or speech is the primary medium for all human lan guages, developed or “new”. Writing systems came much later than the spoken forms. The fact that small children learn and can only learn to speak (and listen) before they write (and read) also indicates that language is primarily vocal, rather than written. The term “human” in the definition is meant to specify that language is human specific. . What are design features of language? “Design features” here refer to the defining properties of

教育学笔记(表格式整理版)精华

教育学 一、教育与教育学 二、教育与社会的发展 三、教育与人的发展 四、中学教育(教育目的与教育制度) 五、学生与教师(师生关系) 六、中学课程 七、中学教学 八、中学德育 九、班主任与班级管理 一、教育与教育学 (一)教育的发展 1教育活动中的三结合——社会教育、学校教育、家庭教育 教育的本质属性是——一种有目的的培养人的社会活动 2教育三大要素——教育者、受教育者、教育影响 3教育起源论:生物起源说(各类动物的生存本能)利托尔诺、沛西·能 心理起源说(源于儿童对成人的无意识模仿)孟禄 劳动起源说(源于劳动过程中社会生产需要与人的发展需要的辩证统一) 米丁斯基、凯洛夫 4

(二)教育学的发展 1教育学时一门以教育现象与教育问题为研究对象,探索教育规律的学科2中国古代教育学思想

二、教育与社会的发展 (一)教育与生产力 1生产力水平决定教育的规模与速度 2教育对生产力有促进作用 (1)教育再生产劳动力(把可能的劳动力转化为现实的劳动力,形成新的劳动力,提高劳 动效率) (2)教育再生产科学知识(使原本由少数人掌握的科学知识为更多人掌握) (二)教育与科学技术 1学校教育是科学知识再生产的最主要途径。 (三)教育与文化 1教育与文化之间的关系——相互依存,相互制约 文化对教育——影响教育目的、内容、教学方法的确立 教育对文化——具有筛选、整理、传递、保存传播、交流更新、创造文化的作用 2教育与文化关系的特殊性 文化本身是一种教育力量

教育本身是一种特殊文化——具有双重文化属性:传递和深化文化的手段、构成文化本体3学校文化是学校全体成员或部分成员习得且共同具有的思想观念和行为方式。 4学校文化的特点为:(一种组织文化、)(整合型较强的文化、)(以传递文化传统为己任)。5学校文化既能给学校预订教育目的带来积极影响也能带来消极影响,这是由学校文中蕴含的(丰富多样性)和(歧义性)决定的 6学校文化的核心是学校各群体所具有的(思想观念和行为方式),其中最具决定性的是(思想观念,特别是(价值观念) 7校园文化可分为(学校物质文化)、(学校组织和制度文化)、(学校精神文化) 8(学校精神文化)是校园文化的核心 9学校精神文化可以分为四种基本成分(认知成分)(情感成分)(价值成分)(理想成分)10校风是学校中物质文化、制度文化、精神文化的统一体,良好的校风对学生个性和品德有陶冶与导向作用 11教育的相对独立性是教育在一定范围内,一定程度上具有独立于政治、经济等其他社会现象的特性。 三、教育与人的发展 (一)个体身心发展 2个体身心发展的影响因素 四、教育目的与教育制度 (一)教育目的 1教育目的是把受教育者培养成一定社会所需要的人的总的要求。它规定把受教育者培养成什么样的人,是培养人的

吴于廑《世界史·古代史编(上卷)》笔记和典型题(含考研真题)详解

吴于廑《世界史·古代史编(上卷)》笔记和典型题详解第1章人类的史前时代 一、人类的起源 1人类在自然界的位置 (1)地球发展分期 ①分为五代:太古代、元古代、古生代、中生代、新生代。 a.最原始的生物出现在太古代的地层。 b.元古代末期出现了原始的腔肠动物、软体动物和节肢动物等多细胞生物。 c.古生代,原始的脊椎动物发展成鱼类。鱼类中一支演化成为两栖动物。两栖动物中的一支又演化为爬行动物。爬行动物的一部分演化为恐龙。 d.中生代,最早的哺乳动物及鸟类在已出现。 e.人类起源于新生代。 ②每个代又分为若干纪,每个纪又分为若干世。 a.新生代第三纪分为古新世、始新世、渐新世、中新世、上新世;是哺乳动物发达的时代。b.第四纪分为更新世和全新世。 (2)人类的产生 ①第三纪的始新世开始出现最早的灵长类。到了渐新世,从原始的灵长类中又先后出现了猴类和猿类,最早的人类就是从古猿演化而来的。 ②人类在自然界动物界,现代人在动物界属于脊索动物门,脊椎动物亚门,哺乳动物纲,灵长目,人科,人属,智人种。 (3)对现代类人猿的认识 ①包括长臂猿、猩猩、大猩猩和黑猩猩。它们的骨骼、肌肉和内脏器官的排列方式,胚胎发

育的过程、血型都和人类相似。这是其他任何动物所没有的。 ②近年来分子生物学的研究证明,人类和现代类人猿有着亲缘关系。 ③现代类人猿并不是人类的祖先,它们也不可能进化成人。人类的祖先是某种早已灭绝的古猿。 2从猿到人的过渡 (1)理论支撑 ①1859年英国学者达尔文出版了《物种起源》一书,揭露了生物进化的规律。1871年他又出版了《人类起源与性的选择》,指出人类和现代的类人猿出自共同的祖先。 ②1876年恩格斯写了《劳动在从猿到人转变过程中的作用》一文。 a.揭示了人类起源和人类社会产生的规律,提出了劳动创造人的理论。 b.提出了关于人类起源和发展的三个科学概念:“攀树的猿群”、“正在形成中的人”和“完全形成的人”。 (2)从猿到人的过程 ①现在所知的最早的古猿是原上猿,1911年、1966~1967年在埃及法雍先后多次发现化石,后者命名为埃及古猿。 ②比埃及古猿更晚的化石古猿是森林古猿,1856年首次发现于法国,后来在欧、亚、非三洲陆续皆有发现。 ③森林古猿后来分化出巨猿、西瓦古猿和腊玛古猿,其中腊玛古猿可能是最早的从猿到人过渡期间的生物。 ④在腊玛古猿之后出现了南方古猿。这是已经可以确定的从猿到人的过渡期间的生物。 ⑤从猿到人过渡期间,学会了制造工具,意味着出现了自觉的能动性(人和动物最重要的区别),标志着从猿到人过渡时期的结束,进入了完全形成的人的阶段。

memcached&redis性能测试

一、Memcached 1.1、memcached简介 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。但是它并不提供冗余(例如,复制其hashmap条目);当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失。 Memcached由Danga Interactive开发,其最新版本发布于2010年,作者为Anatoly Vorobey和Brad Fitzpatrick。用于提升LiveJournal . com访问速度的。LJ每秒动态页面访问量几千次,用户700万。Memcached将数据库负载大幅度降低,更好的分配资源,更快速访问。 1.2、Memcached是如何工作的 Memcached的神奇来自两阶段哈希(two-stage hash)。Memcached就像一个巨大的、存储了很多对的哈希表。通过key,可以存储或查询任意的数据。客户端可以把数据存储在多台memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。举个列子,假设有3个客户端1, 2, 3,3台memcached A, B, C:Client 1想把数 据”tuletech”以key “foo”存储。Client 1首先参考节点列表(A, B, C),计算key “foo”的哈希值,假设memcached B被选中。接着,Client 1直接connect 到memcached B,通过key “foo”把数据”tuletech”存储进去。Client 2使用与Client 1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的

《语言学概论》复习笔记 第一章 语言和语言学——第一节

答题技巧: 简答题——纲领性地阐明 论述题——先阐释论述中出现的概念。深入探讨:全面,即把涉及到论述题中内容的所有知识点有逻辑地组织起来。 第一节 语言的客观存在形式 1.1什么是语言 “语言”不是物质实体,但它客观存在 存在形式首先表现为人与人的“口头交际”行为: 涉及到三个方面: ① 离不开一个个体的生活经历、所处社会地位和要处理的问题 因此涉及大量社会问题、文化问题、哲学问题、逻辑问题 ②大脑要有分析理解语言的机制 涉及复杂的心理和生理问题 ③要有一整套发音、听音的器官和控制神经网 涉及复杂的生理和物理问题 类似通讯理论中编码和解码的过程: 编码——发出——传递——接受——解码 语言的客观存在形式和语言学家研究的语言不完全一样: ①语言客观存在形式有口语和书面语 ②口语存在形式复杂,人人不同且同一人身上也不同,不规整 ③书面语个人也有各自特点 ④语言学家研究的只是经过他们主观概况和不同程度上理想化、简单化了的语言 1.2口语和书面语 口语:语言首先存在的客观形式 书面语:文字出现后,语言的第二种客观形式 口语和书面语的关系: ①分别是语言的两种客观存在形式(语音为载体&文字为载体) ②任何一种语言都是先有口语,后有书面语,且大多数语言在存在的历史上只有口语而没有相应的书面语 ③任何一种书面语只能在口语的基础上产生,且迟早要随着口语的演变而演变 ④口语是第一性的,书面语是第二性的(由于②、③) 口语发生巨变而书面语长期保持古代语言面貌不变的”文言脱节“现象:中国的文言文和西方的拉丁文 这种现象只有在社会发展滞后、教育不普及、交通通讯不发达,极少数人掌握书面语的社会里才能勉强维持。 口语与书面语的主要差别: ①书面语不是口语的忠实记录和机械复制 ②口语比书面语多了各种面部表情、语气语调、手势体态;书面语只记录了词语,比口语更精炼准确,但还要补充描述省略后会影响理解的成分 公式:口语基本语言成分=书面语基本语言成分+书面描写的口语非语言成分 ③书面语产生后具有相对独立性,克服了口语时空上的局限,能累积起更丰富的语汇、更精密复杂的语

相关主题
文本预览
相关文档 最新文档