继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Redis数据类型和常用命令

杨魅力
关注TA
已关注
手记 339
粉丝 56
获赞 259

Redis相较于其它的数据库虽然简单,但是要熟记所有命令的用法也并非易事。一个简单的技巧是通过要操作的数据类型来将这些命令进行结构化。

数据类型和对应命令

所有存储于redis中的数据都对应于一个键值对(key-value pair), key可以是任意二进制序列,通常我们使用字符串来标记一个特定的key。在redis中我们通常称这个key为name或者就叫key, 而对于value,redis支持如下几种类型:

  • strings

  • lists: list内容只能是string

  • sets: set中存储非重复的string

  • sorted sets: 与sets类似,但是每个string都会对应一个float类型的score,从而用于排序

  • hashes: 键值对hash类型,也就是Python中的dict,注意在redis中最外层的key一般叫做name或者key,而value中数据类型如果是dict,那么这个dict中的key通常被称为field。

  • Bit arrays (or simply bitmaps): 实际存储的仍然是string,但是可以针对bit进行操作

  • HyperLogLogs: 用于估计unique value的数量

针对不同的数据类型,会有不同的命令,通过如下脑图可以更加清晰地记忆redis的命令


700

Redis数据类型与常用命令

strings

127.0.0.1:6379> set strtest xyzOK127.0.0.1:6379> get strtest"xyz"
127.0.0.1:6379> mset a 1 b 2 c 3OK127.0.0.1:6379> mget a b c1) "1"
2) "2"
3) "3"
# 注意以下增减操作只能针对整数数字(虽然类型仍然是string类型)
127.0.0.1:6379> incr a(integer) 2
127.0.0.1:6379> incrby b 5
(integer) 7
127.0.0.1:6379> decr b(integer) 6
127.0.0.1:6379> decrby b 3
(integer) 3

lists

lists类型中存储的仍然是string类型

# left push用于从左将item压入到list当中127.0.0.1:6379> lpush list_test 1 2 3(integer) 3# 注意如果想看list中的内容,无法通过get直接去看,get只是针对string,而必须使用lrange127.0.0.1:6379> get list_test 
(error) WRONGTYPE Operation against a key holding the wrong kind of value# 这里0 -1均为list index,表示从index 0 开始到-1结束,-1即从右数最后一个item127.0.0.1:6379> lrange list_test 0 -11) "3"2) "2"3) "1"127.0.0.1:6379> rpush list_test 5 7(integer) 5127.0.0.1:6379> lrange list_test 0 -11) "3"2) "2"3) "1"4) "5"5) "7"127.0.0.1:6379> lpop list_test"3"127.0.0.1:6379> lrange list_test 0 -11) "2"2) "1"3) "5"4) "7"# 从左trim截断list,以下是截取index 0 到index 2 的item作为新的list127.0.0.1:6379> ltrim list_test 0 2OK127.0.0.1:6379> lrange list_test 0 -11) "2"2) "1"3) "5"

hashes (dict)

哈希类型,在python中也就是dict类型。这也是非常常用的数据类型。

127.0.0.1:6379> hset htest a 1(integer) 1127.0.0.1:6379> hget htest a"1"127.0.0.1:6379> hmset htest a 1 b 2 c 3OK127.0.0.1:6379> hmget htest a b c1) "1"2) "2"3) "3"127.0.0.1:6379> hgetall htest1) "a"2) "1"3) "b"4) "2"5) "c"6) "3"127.0.0.1:6379> hkeys htest1) "a"2) "b"3) "c"127.0.0.1:6379> hvals htest1) "1"2) "2"3) "3"

在python程序中使用redis-py driver的时候,通过dict进行操作会非常清晰和简单。

In [1]: import redis

In [2]: r = redis.StrictRedis(host='localhost', port=6379, db=0)

In [3]: d = {"a": 2, "b": 3}

In [4]: key = "test:2"In [5]: r.hmset(key, d)
Out[5]: TrueIn [6]: r.hgetall(key)
Out[6]: {'a': '2', 'b': '3'}

sets

127.0.0.1:6379> sadd set_test a b 33(integer) 3127.0.0.1:6379> sadd set_test c a b 22(integer) 1# 可以看到不会有重复的item127.0.0.1:6379> smembers set_test1) "c"2) "33"3) "a"4) "b"# 用于测试set中是否包含指定的item,如有则返回1,没有返回0127.0.0.1:6379> sismember set_test a
(integer) 1127.0.0.1:6379> sismember set_test xx
(integer) 0127.0.0.1:6379> sadd set_test2 a b 56 66(integer) 4127.0.0.1:6379> smembers set_test21) "56"2) "a"3) "66"4) "b"# 求交集127.0.0.1:6379> sinter set_test set_test21) "a"2) "b"# 求并集127.0.0.1:6379> sunion set_test set_test21) "33"2) "a"3) "56"4) "c"5) "66"6) "22"7) "b"

sorted sets

sorted sets与sets类似,可以保证item不重复,区别在于sorted sets中每个item对应一个float类型的score

127.0.0.1:6379> zadd sort_set 2.2 a(integer) 1
127.0.0.1:6379> zadd sort_set 2 bb(integer) 1
127.0.0.1:6379> zadd sort_set 10 x(integer) 1

# 获取index 从0 到-1的(即所有) items127.0.0.1:6379> zrange sort_set 0 -11) "bb"
2) "a"
3) "x"

# 获取item bb对应的index127.0.0.1:6379> zrank sort_set bb(integer) 0
127.0.0.1:6379> zrank sort_set x(integer) 2
127.0.0.1:6379> zscore sort_set x"10"

# 用于获取对应score set中item的数量
127.0.0.1:6379> zcard sort_set(integer) 3

bit arrays

用于针对指定的key设置位数据为0 或 1。当我们对存储有较高要求,且对于统计为1的item的数量时,使用bit array是一个好的办法。

# 针对bit 7进行设置,设置为1,返回该位之前存储的值
127.0.0.1:6379> setbit bit_test 7 1
(integer) 0
127.0.0.1:6379> setbit bit_test 7 0
(integer) 1
127.0.0.1:6379> get bit_test"\x00"
127.0.0.1:6379> setbit bit_test 8 1
(integer) 0
127.0.0.1:6379> setbit bit_test 9 1
(integer) 0

# 统计有多少位为1
127.0.0.1:6379> bitcount bit_test(integer) 2

HyperLogLogs

redis实现了相应算法可以估计hyperloglog中存储的所有item中非重复的item的数量

127.0.0.1:6379> pfadd loglog 1 3 5 7 1
(integer) 1
127.0.0.1:6379> pfcount loglog(integer) 4

通用的命令

  • keys pattern: pattern可以为glob风格的通配符格式,最常用的是keys *查询所有的keys

  • exists key: 查询该key是否存在

  • del key: 删除该key对应的数据

  • type key: 查询该key对应的value的数据类型

  • expire key: 定义多长时间后key对应的数据过期,过期后数据会被自动删除

  • ttl key: 查询该key对应的剩余存活时间

  • flushdb/flushall: flushdb用于清除当前db的所有数据,flushall清除所有数据库的数据

References

作者:geekpy
链接:https://www.jianshu.com/p/cd434a19c822


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP