转载请说明出处:http://blog.csdn.net/cywosp/article/details/39701409
Redis 默认端口6379
Redis适用场景
1. 取最新N个数据的操作
2. 排行榜应用,取TOP N操作
3. 需要精确设定过期时间的应用
4. 计数器应用
5. Uniq操作,获取某段时间所有数据排重值
6. 实时系统,反垃圾系统
7. Pub/Sub构建实时消息系统——消息的发布与订阅
8. 构建队列系统
9. 缓存
Redis数据类型
Strings类型及操作
String是最简单的类型。一个Key对应一个Value,String类型是二进制安全的。Redis的String可以包含任何数据,比如jpg图片或者序列化的对象。
set key value
get key
setex key time_seconds value 设置key对应的值为String类型的value,并指定此键值的有效期
setnx key value 如果key不存在才设置value,否则返回0
setrange key offset replace_value 设置指定key的value值的子字符串,成功返回替换后的字符串总长度,如果原先的key不存在,则创建,返回offset+strlen(replace_value),其具有替换功能
set email [email protected]
setrange email 7 sina //从email的第8(从1开始)个字符开始替换成sina
get email
[email protected]sinaapp.com
get em
(nil)
setrange em 3 aaa
(integer) 6
get em
"\x00\x00\x00aaa"
mset key1 value1 key2 value2 ... 设置多个key,成功返回ok,失败返回0,所有值都不会成功
msetnx 一次设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已存在的key。(只要有一个没成功,其他的也不会成功)
msetnx key1 value1 kye2 value2 ...
getset key new_value 获取旧值时使用新值替换旧值,如果key不存在,则返回nil,并设置key的值为new_value
getrange key offset_begin offset_end 获取一个key的指定返回字符串
getrange email 3 5
"ric"
mget key1 kye2 kye3 ... 获取多个key值,不存在的key返回(nil)
decr key 对key减一 key--
decrby key value 对key做 key -= value
incr key 对key的值做加1操作,并返回新的值,如果key不存在则创建一个并赋值为0,因此incr后变成1
incrby key value 对key的值加value
incrby k 5
(integer) 5
incrby k -3
(integer) 2
get k
"2"
append key value 对key追加value,返回追加后key值的总长度,如果key不存在则创建
append k .com
(integer) 5
get k
"2.com"
hashes类型及操作
Redis hash是一个String类型的field和value的映射表。它的添加、删除操作都是O(1)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个String类型。将一个对象存储在hash类型中会占用更少的内存,并且可以方便的存取整个对象。
hset hashtable_name field_key value 设置hash field为指定值,如果field_key不存在则先创建
hget hashtable_name field_key
hsetnx hashtable_name field_key value 设置hash field为指定值,如果field_key不存在,则先创建。如果存在则返回0
hmset hashtable_name field_key1 value1 field_key2 value2 ...
hmget hashtable_name field_key1 field_key2
hincrby hashtable_name field_key value 对hash表中的字段field_key 加上value
hexists hashtable_name field_key 判断hash表中的字段field_key是否存在 存在返回1,否则返回0
hdel hashtable_name field_key 删除hash表中的字段field_key删除
hkeys hashtable_name 返回hashtable_name中的全部field_key
hvals hashtable_name 返回hashtable_name中的value值
hgetall hashtable_name 同时返回所有的字段和内容
lists类型及操作
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是String类型的双向链表。我们可以通过push、pop操作链表的头部或者尾部添加删除元素,这样list可以作为栈,又可以作为队列。
lpush list_name_key value 在list_name_key对应list头部添加字符串元素 可以同时插入多个
rpush list_name_key value 从尾部插入 可以同时插入多个
linsert list_name_key before/after value1 value2 在value1前/后插入value2
lrange list_name_key 0 -1 列取list_name_key对应的list的所有值,0代表头,-1代表尾
lset list_name_key i value 将下标为i(i从0开始)的内容替换成value
127.0.0.1:6379> lrange list_0 0 -11) "three"
2) "two"
3) "one"
127.0.0.1:6379> lset list_0 1 four
OK
127.0.0.1:6379> lrange list_0 0 -1
1) "three"
2) "four"
3) "one"
lrem list_name_key count value 从链表中删除count个与value相同的值
127.0.0.1:6379> lrange list_0 0 -11) "one"
2) "one"
3) "one"
4) "one"
5) "three"
6) "four"
7) "one"
127.0.0.1:6379> lrem list_0 3 "one"
(integer) 3
127.0.0.1:6379> lrange list_0 0 -1
1) "one"
2) "three"
3) "four"
4) "one"
127.0.0.1:6379> lrange list_0 0 -1
1) "three"
2) "four"
3) "one"
ltrim list_name_key begin end 保留从begin到end之间的数值,其他的全部删除
127.0.0.1:6379> lrange list_0 0 -11) "one"
2) "one"
3) "one"
4) "three"
5) "four"
6) "one"
127.0.0.1:6379> ltrim list_0 4 5
OK
127.0.0.1:6379> lrange list_0 0 -1
1) "four"
2) "one"
lpop list_name_key 从头部弹出一个元素
127.0.0.1:6379> lrange list_0 0 -11) "four"
2) "one"
127.0.0.1:6379> lpop list_0
"four"
127.0.0.1:6379> lrange list_0 0 -1
1) "one"
rpop list_name_key 从尾部弹出一个元素
rpoplpush list_name_key1 list_name_ley2 从第一个list的尾部移除一个元素并添加到第二个list的头部
lindex list_name_key index 返回名称为list_name_key的list中index位置的元素
127.0.0.1:6379> lrange list_0 0 -11) "ten"
2) "three"
3) "two"
127.0.0.1:6379> lindex list_0 2
"two"
llen list_name_key 返回对应list中的长度
sets类型及操作
set是集合,它是string类型的无序集合。set是通过hash table实现的添加、删除、和查找的复杂度都是O(1)。对集合我们可以取并集、交集、差集。通过这些操作我们可以实现sns中的好友推荐和blog的tag功能。
sadd set_name value 向set_name集合中添加value,集合中不允许有相同的value,插入相同的值时会返回0,表示失败
srem set_name value 将set_name集合中的value删除,删除成功返回1,失败返回0,如果不存在也返回0
spop set_name 在set_name集合中随机弹出一个元素并删除该元素
smembers set_name 列取set_name集合中的所有元素
sdiff set_name_1 set_name_2 计算两个集合的差集
127.0.0.1:6379> smembers s11) "a"
2) "c"
3) "b"
127.0.0.1:6379> smembers s2
1) "d"
2) "c"
127.0.0.1:6379> sdiff s1 s2
1) "a"
2) "b"
127.0.0.1:6379> sdiff s2 s1
1) "d"
sdiffstore set_name_1 set_name_2 set_name_3 取set_name_2和set_name_3差集并将结果存入set_name_1中,
如果set_name_1已经存在,其原始数据将会被删除
127.0.0.1:6379> sdiffstore s3 s1 s2(integer) 2
127.0.0.1:6379> smembers s3
1) "a"
2) "b"
sinter set_name_1 set_name_2 获取交集
sinterstore set_name_3 set_name_1 set_name_2 获取set_name_1和set_name_2的交集并存于set_name_3中
sunion set_name_1 set_name_2 获取并集
sunionstore set_name_3 set_name_1 set_name_2 获取set_name_1和set_name_2的并集存于set_name_3中
smove set_name_1 set_name_2 value 将set_name_1中的value元素移动到set_name_2中,注意,如果value在set_name_2中已存在,则不会被插入,但是set_name_1中的value将会被移除
scard set_name 返回set_name集合中的元素个数
sismember set_name value 判断value是否为set_name集合的元素,返回1代表是,0代表不是
srandmember set_name 随机返回set_name集合的一个元素,但不删除
sorted sets类型及操作
sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存储value,一列存储序列。操作中key理解为zset的名字。
zadd set_name sequence_number value 往顺序集合中添加value,并添加顺序号sequence_number,如果value在集合中已存在,则会添加失败,但是会更新原来value的顺序号为后来更新的顺序号
127.0.0.1:6379> zadd zs1 1 one
(integer) 1127.0.0.1:6379> zadd zs1 2 two
(integer) 1
127.0.0.1:6379> zadd zs1 3 two
(integer) 0
127.0.0.1:6379> zadd zs1 4 four
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "3"
5) "four"
6) "4"
zrange set_name begin end 获取有序集合中下标begin~end范围内的元素,如果end==-1则代表到集合末尾
zrange set_name begin end withscores 将sequence_number一起返回
127.0.0.1:6379> zrange zs1 0 -11) "one"
2) "two"
3) "four"
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "3"
5) "four"
6) "4"
zrem set_name value 删除集合中元素值为value的元素,成功返回1,失败返回0
zincrby set_name n value 将集合中value所对应的序列号增加n
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "two"
2) "3"
3) "four"
4) "4"
127.0.0.1:6379> zincrby zs1 2 two
"5"
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "four"
2) "4"
3) "two"
4) "5"
zrank set_name value 返回集合set_name中按member元素的排名后(按score从小到大排序)value元素的下标(下标从1开始)
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"
2) "1"
3) "four"
4) "4"
5) "two"
6) "5"
127.0.0.1:6379> zrank zs1 two
(integer) 2
zrevrange set_name begin end withscores 按降序排序列取begin~end间的元素
127.0.0.1:6379> zrevrange zs1 0 -1 withscores1) "two"
2) "5"
3) "four"
4) "4"
5) "one"
6) "1"
zrangebyscore set_name begin end withscores 返回顺序号从begin到end的元素返回
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"
2) "1"
3) "three"
4) "2"
5) "five"
6) "3"
7) "four"
8) "4"
9) "two"
10) "5"
127.0.0.1:6379> zrangebyscore zs1 2 4 withscores
1) "three"
2) "2"
3) "five"
4) "3"
5) "four"
6) "4"
zcount set_name begin end 返回集合中顺序号begin~end元素的个数
127.0.0.1:6379> zcount zs1 2 4(integer) 3
zcard set_name 返回集合中的所有元素个数
127.0.0.1:6379> zcard zs1(integer) 5
zremrangebyrank set_name begin end 将索引(从0开始)区间为begin~end的元素删除
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"
2) "1"
3) "three"
4) "2"
5) "five"
6) "3"
7) "four"
8) "4"
9) "two"
10) "5"
127.0.0.1:6379> zremrangebyrank zs1 1 3
(integer) 3
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "one"
2) "1"
3) "two"
4) "5"
zremrangebyscore set_name begin end 按顺序号从begin~end的元素删除
127.0.0.1:6379> zrange zs1 0 -1 withscores1) "one"
2) "1"
3) "two"
4) "5"
127.0.0.1:6379> zremrangebyscore zs1 1 3
(integer) 1
127.0.0.1:6379> zrange zs1 0 -1 withscores
1) "two"
2) "5"
Redis常用命令
Redis提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以在Linux终端使用
1. 键值相关命令
2. 服务器相关命令
Redis默认有0~15共16个数据库,使用select命令来进入不同的数据库,默认进入0数据库,select 1表示进入1数据库
1. 键值相关命令
keys * 表示取出所有的key,类似模糊匹配,可在前或者在后添加多个字符
exists key 用于判断对应的key是否存在,存在返回1,否则返回0
del key 删除key,如果key不存在则返回0表示失败 同时可以删除多个
expire key seconds 对已存在的key设置过期时间为seconds秒
ttl key 获取key还剩多长时间过期,如果返回-2则表示已过期
move key database_number 将key从当前数据库移动到database_number数据库中
persist key 移除key的过期时间,让其不过期,此时使用ttl命令查看则返回-1,表示取消了过期时间
randomkey key 随机返回一个当前数据库中的一个key
rename key new_key 重命名key为new_key
type key 返回key所属的数据类型
2.服务器相关命令
ping 检查当前连接是否正常,正常返回PONG
echo test 输出test与linux shell的echo一样
select n Redis数据库编号从0~15,我们可以任意选择一个数据库进行数据存取
quit 退出当前连接
dbsize 返回当前数据库中key的总数目
info 获取Redis服务器的相关信息
config get 实时转储收到的请求
config get * 获取所有
flushdb 删除当前数据库中的所有库
flushall 删除所有数据库中的所有key(谨慎使用)
Redis高级实用特性
1. 安全性
设置客户端连接后进行任何其他操作前需要实用的密码
警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150k次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
修改配置文件redis.conf
requirepass cynric #cynric即为密码,可以使用redis-cli -a cynric指定密码登陆,也可以登陆后通过auth cynric来授权
2. 主从复制
Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。其特点有:(1)master可以拥有多个slave (2)多个slave可以连接同一个master,还可以连接到其它slave (3)主从复制不会阻塞master,在同步数据时,master可以继续处理client请求。(4)提高系统的伸缩性
配置主从服务器,修改配置文件slaveof ip port 如果主机配置了密码则需要配置masterauth passwd
查看当前Redis主机是master还是slave可以通过info命令查看
3. 事务处理
Redis对事务的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,Redis会顺序的执行队列中的所有命令。在还没有执行exec之前可以通过discard命令取消还未执行的事务。如果事务中的某个命令执行出错,则事务不会回滚,已经正确执行的命令不会回滚。
multi 可用于打开事务上下文
4. 乐观锁复杂事务控制
大多数是基于数据版本(version)的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是为数据库表添加一个"version"字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交的版本号与数据库表对应记录的当前版本号进行对比,如果提交的数据版本号大于数据库当前版本号,则予以更新,否则认为是过期数据。
watch命令会监视给定的key,当exec时,如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。exec,discard,unwatch命令都会清除连接中的所有监视。
watch key 用于监视key的变化
5.持久化机制
Redis是一个支持持久化的内存数据库,就是说Redis需要经常将内存中的数据同步到硬盘来保证持久化。
Redis支持两种持久方式:
1. Snapshotting方式即快照方式
该方式是默认的持久化方式。这种方式是将内存中数据以快照的方式写入二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
2. aof方式(Append-Only File)
由于快照方式是在一定间隔时间做一次的,所以如果Redis意外down掉的话,就会丢失最后一次快照的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,Redis会将每一个收到的写命令都通过write函数追加到文件中,当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于操作系统会在内核中缓存write做的修改,所以可能不是立即写到磁盘上,这样aof方式的持久化也还是有可能丢失部分数据。可以通过配置文件告诉Redis通过fsync函数强制写入到磁盘的时机。
appendonly yes #启用aof持久化方式,默认为no
appendfsync always #收到写命令就立即写入磁盘,最慢,但保证完全的持久化
appendfsync everysec #每一秒钟写入磁盘一次,在性能和持久化方面做了很好的折中,此为默认方式
appendfsync no #完全依赖操作系统的自动写入磁盘机制,性能最好,持久化没保证
6. 发布及订阅消息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解除消息发布者和消息订阅者之间的耦合,Redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subcribe和psubscribe命令向Redis server订阅自己感兴趣的消息类型,Redis将信息类型成为通道(channel)。当发布者通过publish命令向Redis server发送特定类型的信息时,订阅该类型信息的全部client都会收到此消息。
subscribe channel_name ... 订阅channel_name频道"..."代表可是同时订阅到过频道
publish channel_name ... message 向channel_name频道中发布message消息
127.0.0.1:6379> publish tv1 "test message"(integer) 2
127.0.0.1:6379> subscribe tv1 tv2
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "tv1"
3) (integer) 1
1) "subscribe"
2) "tv2"
3) (integer) 2
1) "message"
2) "tv1"
3) "test message"
注:先得subscribe订阅频道,publish才会成功
7. 虚拟内存的使用(Redis 3.0中虚拟内存配置取消了)
Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是其思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出内存用于其他需要访问的数据。尤其是对Redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个Redis server外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。相关配置如下:
vm-enabled yes #开启vm功能,默认为no
vm-swap-file /tmp/redis.swap #交换出来的value保存的文件路径
vm-max-memory 1000000 #Redis使用的最大内存上限
vm-page-size 32 #每个页面的大小32字节
vm-page 134217728 #最多使用多少页面
vm-max-threads 4 #用于执行value对象换入的工作线程数量