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 2018-01-15 20:37  super2feng  阅读(156)  评论(0)    收藏  举报