Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
本文讨论常用的五个数据类型:字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)。
存储空间:
key | value |
---|---|
key1 | itinfo |
key2 | redis |
用处 | 语法 |
---|---|
添加/修改数据 | set key value |
获取数据 | get key |
删除数据 | del key |
添加/修改多个数据 | mset key1 value1 key2 value2 …(multiple) |
获取多个数据 | mget key1 key2 … |
获取数据字符个数(字符串长度) | strlen key |
追加信息到原始信息后部(如果原始信息存在就追加,否则新建) | append key value |
get 、set
-
mget、mset
不存在的key显示nil
strlen、append
指令 --------> Redis(t1)
Redis处理数据(t2)
指令 <-------- Redis(t3)
n个数据的情况:
set: n*(t1+t2+t3)
mset: t1+t3+n*t2
set总体时间多:(n-1)*(t1+t3)
用处 | 语法 |
---|---|
设置数值数据增加指定范围的值 | incr key 、incrby key increment 、 incrbyfloat key increment |
设置数值数据减少指定范围的值 | decr key 、decrby key increment |
设置数据具有指定的生命周期 | setex key seconds value、psetex key milliseconds value |
上例中设置key-ccie的生命周期为8秒,8秒后ccie被移除
- 表示运行结果是否成功
(integer) 0 → false 失败
(integer) 1 → true 成功- 表示运行结果值
(integer) 3 → 3个
(integer) 1 → 1个
setex WeiXinID:12384932xx09 14400 No28
这是因为:
- string在Redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
- Redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
user: id:3506728370:fans 65535
user: id:3506728370:follow 78
数据库中的热点数据key命名惯例,key 的设置约定
表名 :主键名 :主键值 :字段名
如-order :id :390472345 :name
如上的大V主页的例子,使用str数据类型显得太过于笨重,需要对一系列存储的数据进行编组,方便管理。这个时候可以使用Hash散列。
功能 | 语法 |
---|---|
添加/修改数据 | hset key field value |
添加/修改数据,之前检查是否存在 | hsetnx key field value |
获取数据 | hget key field、hgetall key |
删除数据 | hdel key field1 [field2] |
添加/修改多个数据 | hmset key field1 value1 field2 value2 … |
获取多个数据 | hmget key field1 field2 … |
获取哈希表中字段的数量 | hlen key |
获取哈希表中是否存在指定的字段 | hexists key field |
获取哈希表中所有的字段名或字段值 | hkeys key、hvals key |
设置指定字段的数值数据增加指定范围的值 | hincrby key field increment、hincrbyfloat key field increment |
- n0后的每个数据要动一下
- 寻址快,变化慢
2.链表
表头指针—>n1—>n2—>n3—>n4
插入n0
表头指针–X-->n1—>n2—>n3—>n4 #断开链接
表头指针—>n0,n1—>n2—>n3—>n4 #链接插入的元素
表头指针—>n0—>n1—>n2—>n3—>n4
只需要改变插入元素前后
变化快,寻址慢
功能 | 语法 |
---|---|
添加/修改数据 | lpush key value1 [value2] ……、rpush key value1 [value2] …… |
获取数据 | lrange key start stop、lindex key index |
获取元素数量 | llen key |
获取并移除数据 | lpop key、rpop key |
规定时间内获取并移除数据 | blpop key1 [key2] timeout、brpop key1 [key2] timeout |
规定时间内获取并移除数据放入目标队列 | brpoplpush source destination timeout |
移除指定数据 | lrem key count value |
功能 | 语法 |
---|---|
添加数据 | sadd key member1 [member2] |
获取全部数据 | smembers key |
删除数据 | srem key member1 [member2] |
获取集合数据总量 | scard key |
判断集合中是否包含指定数据 | sismember key member |
随机获取集合中指定数量的数据 | srandmember key [count] |
随机获取集合中的某个数据并将该数据移出集合 | spop key [count] |
注意是members,不是member
srandmembers取出后原set不变
spop取出后原set该元素被弹出
集合计算
交:A∩B
并:A∪B
差:A-B
功能 | 语法 |
---|---|
求两个集合的交集 | sinter key1 [key2] |
求两个集合的并集 | sunion key1 [key2] |
求两个集合的差集 | sdiff key1 [key2] |
求两个集合的交集并存储到指定集合中 | sinterstore destination key1 [key2] |
求两个集合的并集并存储到指定集合中 | sunionstore destination key1 [key2] |
求两个集合的差集并存储到指定集合中 | sdiffstore destination key1 [key2] |
将指定数据从源集合中移动到目标集合中 | smove source destination member |
注意:集合差有方向性
将set01中的etaon移到set02:
功能 | 语法 |
---|---|
添加数据 | zadd key score1 member1 [score2 member2] |
获取全部数据 | zrange key start stop [WITHSCORES]、zrevrange key start stop [WITHSCORES] |
删除数据 | zrem key member [member …] |
按条件获取数据 | zrangebyscore key min max [WITHSCORES] [LIMIT]、zrevrangebyscore key max min [WITHSCORES] |
条件删除数据 | zremrangebyrank key start stop、zremrangebyscore key min max |
获取集合数据总量 | zcard key、zcount key min max |
集合交、并操作 | zinterstore destination numkeys key [key …]、zunionstore destination numkeys key [key …] |
注意:
- min与max用于限定搜索查询的条件
- start与stop用于限定查询范围,作用于索引,表示开始和结束
别忘了withscores
功能 | 语法 |
---|---|
获取数据对应的索引(排名) | zrank key member、zrevrank key member |
score值获取与修改 | zscore key member、zincrby key increment member |
排行榜或资源排序
实际排名为:zrank结果+1
带有权重的任务,优先处理权重高的任务,采用score记录权重。
例如设定外贸订单优先于国内订单,总裁订单优先于员工订单,经理订单优先于员工订单:
- 设置外贸101,国内102,经理004,员工008
- 员工下的外贸单score值为101008(优先)
- 经理下的国内单score值为102004
注意: