文章目录

  • 前言
  • key
  • string
  • list
  • hash
  • set
  • sorted set


前言

这两天学习一下Redis,首先回顾一下Redis中的key和5种value数据类型:string, list, hash, set, zset/sorted_set。
主要学习redis的命令,以及联想出各种类型的应用场景。
Redis中文官网

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

二进制安全
存储数据时不顾及编码格式,直接序列化成字节数组,所以没有数据集约束,这种情况就是二进制安全。
redis客户端常用命令

help @grep[string/list/hash/set/sorted_set]
type key # 该key对应的value值类型
exists key # 返回1或0标识给定key的值是否存在
del key # 返回1或0标识值是被删除(值存在)或者没被删除(key对应的值不存在)

key

Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。

关于key的几条规则:

长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
太短的键值通常也不是好主意,如果你要用u:1000:pwd来代替user:1000:password,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key object和value object本身来说很小。当然,没人阻止您一定要用更短的键值节省一丁点儿空间。
-最好坚持一种模式。例如:object-type:id:field就是个不错的注意,像这样user:1000:password。我喜欢对多单词的字段名中加上一个点,就像这样:comment:1234:reply.to

string

支持操作字符串/数值/位图(bitmap),是二进制安全的。
String类型常用命令

set key value
get key
strlen key # 值的字节长度
append key value # 给该key追加value

incr key # 将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值
incrby key 50 # +50
decr key # -1
decrby key 50 # -50

setbit key offset value # offset表示偏移量
bitcount key [start end] # bitcount表示字节索引,查这个区间里一共有多少1
bitcount key 0 -1 # 表示value所有区间
bitop operation destkey key [key……] # 逻辑语句operation:and or not

man ascii # manual 查看Ascii码字符集(最多可表示127个字符)

String应用场景
字符串:键值对类型的数据,eg:session信息
数值:计数器/限流/秒杀
位图:统计用户某时间段内的登录次数/统计某时间段内的活跃用户数量/大数量库存备货

list

按插入顺序排序的字符串元素的集合。他们基本上就是个双向链表(linked lists)。
list常用命令

help @list # 查询出的命令带l的表示list或left(reight)

lpush key value value…… # LPUSH 命令可向list的左边(头部)添加一个新元素
rpush key value value…… # RPUSH命令可向list的右边(尾部)添加一个新元素
lrange key 0 -1 # LRANGE 命令可从list中取出一定范围的元素
注意:LRANGE 带有两个索引,一定范围的第一个和最后一个元素。这两个索引都可以为负来告知Redis从尾部开始计数,因此-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。
rpop key # 命令pop,它从list中删除元素并同时返回删除的值。可以在左边或右边操作

list应用场景
同向放取:栈
逆向放取:队列
定点取值:数组

hash

由field和关联的value组成的map。field和value都是字符串的。这和Ruby、Python的hashes很像。
hash常用命令

> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hget user:1000 username
"antirez"
> hget user:1000 birthyear
"1977"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"
Hash 便于表示 objects,实际上,你可以放入一个 hash 的域数量实际上没有限制(除了可用内存以外)。所以,你可以在你的应用中以不同的方式使用 hash。

HMSET 指令设置 hash 中的多个域,而 HGET 取回单个域。HMGET 和 HGET 类似,但返回一系列值

hash应用场景
聚合数据
商品详情页

set

不重复且无序的字符串元素的集合
去重/无序/集合
set常用命令

sadd k1  1 2 3 4
sadd k2  3 4 5 6 
sinter k1 k2 #交集 结果:3 4
sunion k1 k2 #并集 结果:1 2 3 4 5 6
sdiff k1 k2 #差集 剔除二者交集,保留左边剩余集合 结果1 2
sdiff k2 k1 #结果 5 6

set应用场景
推荐系统
共同好友:交集
可能认识的人:差集

sorted set

类似Set,但是每个字符串元素都关联到一个叫score浮动数值(floating number value)。里面的元素总是通过score进行着排序,所以不同的是,它是可以检索的一系列元素。(例如你可能会问:给我前面10个或者后面10个元素)。
去重/有序/集合
排序算法:skiplist,跳跃排序
Sorted set常用命令

zadd key [NX|XX] [CN] [INCR] score member [score member……]
zrange # 从小到大排序
zrange key 0 1 # 从小到大取前两名
zrevrange key 0 1 # 从大到小取前两名
zincrby key increment member # 给某个成员的score加increment

Sorted set应用场景
排行榜
评论的分页