Redis:redis是一个key-value存储系统。和Memcached类似.
Linux下Redis安装:
- wget http://download.redis.io/releases/redis-3.0.6.tar.gz
- tar -zxf redis-3.0.6.tar.gz
- cd redis-3.0.6
- make && make install
启动服务端:
- redis-server &
启动客户端:
- redis-cli
常用操作:
1、string操作
redis中的String在内存中按照一个key对应一个value来存储。

set(name, value, ex=None, px=None, nx=False, xx=False) # 设置key value
在Redis中设置值,默认不存在则创建,存在则修改
参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有key不存在时,当前set操作才执行
xx,如果设置为True,则只有key存在时,岗前set操作才执行
127.0.0.1:6379> set name fone OK 127.0.0.1:6379> set name2 zff ex 2 # 数据保存时间为2秒 OK 127.0.0.1:6379> setex name2 2 zff # 数据只保存2秒,psetex为设置成毫秒 OK
GET key # 获取value
127.0.0.1:6379> get name "fone" 127.0.0.1:6379> get none (nil)
MSET key value [key value ...] # 批量设置
MGET key [key ...] # 批量獲取
127.0.0.1:6379> mset age 23 sex man city sz
OK
127.0.0.1:6379> mget age city
1) "23"
2) "sz"
GETSET key value # 设置新值并获取原值
127.0.0.1:6379> getset name fon2 "fone" 127.0.0.1:6379> get name "fon2"
GETRANGE key start end # value切片
127.0.0.1:6379> getrange name 1 3 "on2"
SETRANGE key offset value # 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)
127.0.0.1:6379> setrange name 1 _one (integer) 5 127.0.0.1:6379> get name "f_one"
SETBIT key offset value # 对key对应value的二进制位进行操作
127.0.0.1:6379> set key1 a # 此時設置的key1值“a”對應ASCII為97,對應的二進制就是01100001 OK 127.0.0.1:6379> get key1 "a" 127.0.0.1:6379> setbit key1 6 1 # 這裡將二進制的第6位置1,即變為01100011,ASCII對應的值為“c” (integer) 0 127.0.0.1:6379> get key1 "c"
GETBIT key offset # 获取key对应value的二进制表示中的某位的值(0或1)
127.0.0.1:6379> getbit key1 6
(integer) 1
setbit / getbit (裝逼)應用:保存超大門戶網站(億級)用戶的登錄狀態,在線狀態為1,不在線狀態為0
127.0.0.1:6379> setbit status 123 1 # 編號123的用戶登錄,狀態置1 (integer) 0 127.0.0.1:6379> getbit status 123 # 查看編號123用戶的狀態 (integer) 1 127.0.0.1:6379> getbit status 100 # 查看編號100用戶的狀態 (integer) 0
如此實現用最小的存儲空間保存所有用戶的登錄狀態,只要10Mb就鞥存下8千萬用戶的狀態(10,000,000B * 8bit)
BITCOUNT key [start end] # 获取key对应value的二进制表示中 1 的个数
127.0.0.1:6379> bitcount key1 # key1值“c”對應的二進制01100011中有4個1 (integer) 4
STRLEN key # 返回key对应value的字节长度(一个汉字3个字节)
127.0.0.1:6379> strlen name # name : f_one (integer) 5
INCR key # 自增 key对应的value,当key不存在时,则创建,注意只對整數操作。
DECR key # 自减 key对应的value,当key不存在时,则创建,注意只對整數操作。
127.0.0.1:6379> incr key2 (integer) 1 127.0.0.1:6379> incr key2 (integer) 2 127.0.0.1:6379> decr key2 (integer) 1 127.0.0.1:6379> decr key2 (integer) 0 127.0.0.1:6379> decr key2 (integer) -1 127.0.0.1:6379> get key2 "-1"
APPEND key value # 在value后面追加内容
127.0.0.1:6379> get name2 "zff" 127.0.0.1:6379> append name2 222 (integer) 6 127.0.0.1:6379> get name2 "zff222"
127.0.0.1:6379> keys * # 列出所有key 1) "name" 2) "key1" 3) "status" ... ...
在python中操作只需加上括号即可,用法相同。
代码范例:
import redis r = redis.Redis(host='192.168.33.6', port=6379) r.set('foo', 'Bar') print(r.get('foo'))
2、hash操作
hash表现形式上有些像pyhton中的dict,可以存储一组关联性较强的数据 , redis中Hash在内存中的存储格式如下图:

hset name key value # Redis(name)对应的hash中设置一个键值对(不存在,则创建;否则,修改)
参数:
# name:redis的name
# key:name对应的hash中的key
# value:name对应的hash中的value
127.0.0.1:6379> hset info name fone2 (integer) 1 127.0.0.1:6379> hset info age 23 (integer) 1 127.0.0.1:6379> hset info sex man (integer) 1 127.0.0.1:6379> hget info name # 单个获取 "fone2" 127.0.0.1:6379> HGETALL info # 获取Redis(info)中所有的key和value 1) "name" 2) "fone2" 3) "age" 4) "23" 5) "sex" 6) "man" 127.0.0.1:6379> hkeys info # 获取Redis(info)中所有的key 1) "name" 2) "age" 3) "sex" 127.0.0.1:6379> hvals info # 获取Redis(info)中所有的value 1) "fone2" 2) "23" 3) "man"
HMSET name key value [key value ...] # 在Redis对应的hash中批量设置键值对
127.0.0.1:6379> hmset info2 a 1 b 2 c 3 OK 127.0.0.1:6379> hgetall info2 1) "a" 2) "1" 3) "b" 4) "2" 5) "c" 6) "3"
HMGET name key [key ...] # 获取Redis中多个key对应的value
127.0.0.1:6379> HMGET info2 a b 1) "1" 2) "2"
HLEN name # 获取Redis对应的hash中键值对的个数
127.0.0.1:6379> hlen info
(integer) 3
HEXISTS name key # 检查Redis对应的hash是否存在当前传入的key
127.0.0.1:6379> hexists info2 a (integer) 1 127.0.0.1:6379> hexists info2 d (integer) 0
HDEL name key [key ...] # 将Redis对应的hash中指定key的键值对删除
127.0.0.1:6379> hdel info2 a b (integer) 2 127.0.0.1:6379> hgetall info2 1) "c" 2) "3"
HINCRBY name key increment # 自增Redis对应的hash中的指定key的value,不存在则创建
127.0.0.1:6379> hincrby info2 c 1 # 自增1 (integer) 4 127.0.0.1:6379> hincrby info2 c 3 # 自增3 (integer) 7
HSCAN name cursor [MATCH pattern] [COUNT count] # 正则匹配key输出
(cursor为游标,即基于游标分批取获取数据) 如:
# 第一次: cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None) # 第二次: cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None) 127.0.0.1:6379> hscan info 0 match a* 1) "0" 2) 1) "age" 2) "23"
3、list操作
Redis中的 list 在内存中按照一个name对应一个List来存储。

LPUSH key value [value ...] # 从左往list中添加元素,list不存在时创建
LPUSHX key value # 从左往一个已存在的list中添加元素,list不存在时不创建
RPUSH key value [value ...] #从右往list中添加元素,list不存在时创建
RPUSHX key value # 从右往一个已存在的list中添加元素,list不存在时不创建
127.0.0.1:6379> lpush names Z fone zff feng (integer) 4 127.0.0.1:6379> lpushx names double (integer) 5 127.0.0.1:6379> rpush names victor (integer) 6 127.0.0.1:6379> RPUSHX names test (integer) 7
LRANGE key start stop # 取出list中的元素,从左往右取,后进先出(LiFo)
127.0.0.1:6379> lrange names 0 -1 1) "double" 2) "feng" 3) "zff" 4) "fone" 5) "Z" 6) "victor" 7) "test"
LLEN key # 查看list内元素个数
127.0.0.1:6379> llen names
(integer) 7
LINSERT key BEFORE|AFTER pivot value # 往list中指定位置插入元素
127.0.0.1:6379> linsert names after fone haha (integer) 8 127.0.0.1:6379> lrange names 0 -1 1) "double" 2) "feng" 3) "zff" 4) "fone" 5) "haha" ...
LSET key index value # 修改list中第几个元素的值,注意这里index是元素序号
127.0.0.1:6379> lset names 1 FENG OK 127.0.0.1:6379> lrange names 0 -1 1) "double" 2) "FENG" ...
LREM key count value # 删除list中的元素,注意:一定要带上要删除的个数count
127.0.0.1:6379> lrem names 1 double (integer) 1 127.0.0.1:6379> lrange names 0 -1 1) "FENG" 2) "zff" ...
LPOP key # 获取list中的第一个元素并删除(类似queue)
127.0.0.1:6379> lpop names "FENG" 127.0.0.1:6379> lrange names 0 -1 1) "zff" 2) "fone" ...
LINDEX key index # 依据元素序号获取list中的元素
127.0.0.1:6379> lindex names 1 "fone"
LTRIM key start stop # 将没有在分片里面的list元素删除(排他)
127.0.0.1:6379> ltrim names 1 2 OK 127.0.0.1:6379> lrange names 0 -1 1) "fone" 2) "haha"
RPOPLPUSH source destination # 从源list的右侧移动一个元素到目标list的左侧,并将该元素返回
127.0.0.1:6379> rpoplpush names name "haha" 127.0.0.1:6379> lrange name 0 -1 1) "haha" 127.0.0.1:6379> lrange names 0 -1 1) "fone"
BLPOP key [key ...] timeout # 将多个list排列,按照从左到右去pop对应list的元素(即lpop)
127.0.0.1:6379> blpop name names 3 1) "name" 2) "haha" 127.0.0.1:6379> blpop name names 3 1) "names" 2) "fone"
BRPOPLPUSH source destination timeout # 从源list的右侧移动一个元素到目标list的左侧,可设置超时时间
127.0.0.1:6379> brpoplpush name names 3 "haha"
注意:最后两例的超时时间可用于生产者消费者模型:
开两个终端都进入Redis,一个输入命令blpop或brpoplpush消费元素,另一个在超时时间内往list中添加元素(生产)
终端一执行命令:
127.0.0.1:6379> brpoplpush name names 3
终端二:
127.0.0.1:6379> lpush name haha
(integer) 1
回看终端一消费元素:
127.0.0.1:6379> brpoplpush name names 3 "haha" (1.27s)
4、set操作
(1) 无序集合
集合操作不允许重复加入元素
SADD key member [member ...] # 加入set元素
127.0.0.1:6379> sadd s1 a (integer) 1 127.0.0.1:6379> sadd s1 a b c c (integer) 2
SCARD key # 获取set中元素个数
127.0.0.1:6379> scard s1
(integer) 3
SMEMBERS key # 获取set中的所有元素
127.0.0.1:6379> smembers s1 1) "b" 2) "c" 3) "a"
SDIFF key [key ...] # 取在第一个set中但不在第二个set中的元素(差集)
127.0.0.1:6379> sadd s2 c d e (integer) 3 127.0.0.1:6379> sdiff s1 s2 1) "b" 2) "a"
SDIFFSTORE destination key [key ...] # 获取多个set的差集,另存入差集目标set中
127.0.0.1:6379> sdiffstore s3 s1 s2 (integer) 2 127.0.0.1:6379> smembers s3 1) "b" 2) "a"
SINTER key [key ...] # 取多个set的交集
127.0.0.1:6379> sinter s1 s2 1) "c"
SINTERSTORE destination key [key ...] # 获取多个set的交集,另存入到目标set中
127.0.0.1:6379> sinterstore s3 s1 s2 (integer) 1 127.0.0.1:6379> smembers s3 1) "c"
SISMEMBER key member # 检查元素是否在set中
127.0.0.1:6379> sismember s1 a (integer) 1 127.0.0.1:6379> sismember s1 afds (integer) 0
SMOVE source destination member # 将源set的元素移动到目标set中
127.0.0.1:6379> smove s1 s2 a (integer) 1 127.0.0.1:6379> smembers s1 1) "b" 2) "c" 127.0.0.1:6379> smembers s2 1) "d" 2) "e" 3) "c" 4) "a"
SPOP key # 从set中移除一个元素并返回
127.0.0.1:6379> spop s2 "c" 127.0.0.1:6379> smembers s2 1) "d" 2) "e" 3) "a"
SRANDMEMBER key [count] # 从set中随机获取(count个)元素
127.0.0.1:6379> srandmember s2 2 1) "d" 2) "e" 127.0.0.1:6379> srandmember s2 "e"
SREM key value [value ...] # 从set中删除指定值
127.0.0.1:6379> srem s2 a (integer) 1 127.0.0.1:6379> smembers s2 1) "d" 2) "e"
SUNION key [key ...] # 取set并集
127.0.0.1:6379> sunion s1 s2 1) "d" 2) "b" 3) "e" 4) "c"
SUNIONSTORE destination key [key ...] # 取set并集另存入目标set
127.0.0.1:6379> sunionstore s3 s1 s2 (integer) 4 127.0.0.1:6379> smembers s3 1) "d" 2) "b" 3) "e" 4) "c"
SSCAN key cursor [MATCH pattern] [COUNT count] # 匹配获取set元素
127.0.0.1:6379> sscan s1 0 match b* 1) "0" 2) 1) "b"
(2) 有序集合
在集合的基础上,为每元素排序。对于有序集合,每一个元素有两个值,即:值和分数,分数专门用来做排序。
ZADD key [NX|XX] [CH] [INCR] score value [score value ...] # 在有序set中添加元素,注意先分数后值
127.0.0.1:6379> zadd z1 1 b 2 c 3 a
(integer) 3
ZRANGE key start stop [WITHSCORES] # 查看有序set的值
127.0.0.1:6379> ZRANGE z1 0 -1 1) "b" 2) "c" 3) "a"
127.0.0.1:6379> ZRANGE z1 0 -1 withscores # 一并查看值和分数 1) "b" 2) "1" 3) "c" 4) "2" 5) "a" 6) "3"
ZCARD key # 查看有序set的元素个数
127.0.0.1:6379> zcard z1
(integer) 3
ZCOUNT key min max # 查询有序set中指定分数区间的元素个数
127.0.0.1:6379> zcount z1 0 2
(integer) 2
ZINCRBY key increment value # 修改有序set中元素的分数
127.0.0.1:6379> zincrby z1 3 b "4" 127.0.0.1:6379> ZRANGE z1 0 -1 withscores 1) "c" 2) "2" 3) "a" 4) "3" 5) "b" 6) "4"
ZRANK key value # 获取值在有序set中的序号
127.0.0.1:6379> zrank z1 a (integer) 1 127.0.0.1:6379> zrank z1 c (integer) 0
ZREM key value [value ...] # 删除有序set中的指定元素
127.0.0.1:6379> zrem z1 c (integer) 1 127.0.0.1:6379> zrange z1 0 -1 1) "a" 2) "b"
ZREMRANGEBYRANK key start stop # 根据指定序号范围删除
127.0.0.1:6379> zremrangebyrank z1 0 3 (integer) 2 127.0.0.1:6379> zrange z1 0 -1 (empty list or set)
ZREMRANGEBYSCORE key min max # 根据指定分数范围删除
127.0.0.1:6379> zadd z1 3 a 6 b 8 c (integer) 3 127.0.0.1:6379> zremrangebyscore z1 0 3 (integer) 1 127.0.0.1:6379> zrange z1 0 -1 withscores 1) "b" 2) "6" 3) "c" 4) "8"
ZSCORE key member # 获取有序set中值对应的分数
127.0.0.1:6379> zscore z1 b "6"
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] # 获取(多个)有序set的取交集并将分数相加
127.0.0.1:6379> zrange z2 0 -1 withscores 1) "c" 2) "2" 3) "a" 4) "3" 127.0.0.1:6379> zrange z1 0 -1 withscores 1) "b" 2) "6" 3) "c" 4) "8"
127.0.0.1:6379> zinterstore z3 2 z1 z2 # zinterstore 另存为有序set名 参与取交集的有序set数量 有序set1 有序set2... (integer) 1 127.0.0.1:6379> zrange z3 0 -1 withscores 1) "c" 2) "10"
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] # 获取(多个)有序set取并集并将交集分数相加
127.0.0.1:6379> zunionstore z3 2 z1 z2 (integer) 3 127.0.0.1:6379> zrange z3 0 -1 withscores 1) "a" 2) "3" 3) "b" 4) "6" 5) "c" 6) "10"
ZSCAN key cursor [MATCH pattern] [COUNT count] # 匹配(值)输出有序set中的值和分数
127.0.0.1:6379> zscan z1 1 match b* 1) "0" 2) 1) "b" 2) "6"
5、其他常用操作:
KEYS pattern # 查询key,可使用正则匹配
127.0.0.1:6379> keys z* 1) "z1" 2) "z2" 3) "z3"
DEL key [key ...] # 删除key
127.0.0.1:6379> keys * 1) "z1" 2) "z3" 3) "z2" 4) "s3" 5) "names" 6) "s1" 7) "s2" 127.0.0.1:6379> del z3 (integer) 1 127.0.0.1:6379> keys * 1) "z1" 2) "z2" 3) "s3" 4) "names" 5) "s1" 6) "s2"
EXISTS key [key ...] # 查询key是否存在,存在返回1,不存在返回0
127.0.0.1:6379> exists name (integer) 0 127.0.0.1:6379> exists names (integer) 1
EXPIRE key seconds # 对key设置超时时间
127.0.0.1:6379> expire s3 3 (integer) 1 127.0.0.1:6379> keys s* 1) "s1" 2) "s2"
RENAME key newkey # key重命名
127.0.0.1:6379> SMEMBERS s2 1) "b" 2) "c" 127.0.0.1:6379> keys s* 1) "s2" 127.0.0.1:6379> rename s2 s5 OK 127.0.0.1:6379> SMEMBERS s5 1) "b" 2) "c" 127.0.0.1:6379> keys s* 1) "s5"
· Redis中自带有16个DB(序号从0~15),默认是在0号DB下,可以通过select number切换。
MOVE key db # 将当前DB的key移动到其他DB
127.0.0.1:6379> move s5 2 (integer) 1 127.0.0.1:6379> keys s* (empty list or set) 127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> keys s* 1) "s5" 127.0.0.1:6379[2]> smembers s5 1) "b" 2) "c"
RANDOMKEY # 随机获取一个key
127.0.0.1:6379> randomkey "z1"
TYPE key # 获取key的类型
127.0.0.1:6379> type z1 zset # 有序集合 127.0.0.1:6379> type names list # 列表
SCAN cursor [MATCH pattern] [COUNT count] # 正则匹配key名,keys也有同样的作用
127.0.0.1:6379> scan 0 match z* 1) "0" 2) 1) "z1" 2) "z2"
posted on
浙公网安备 33010602011771号