一、概述
参考作者( 架构师余胜军 ,程序员历小冰)
redis字典结构参考博客
RDB参考图片
Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。
键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。
二、数据类型
数据类型 | 可以存储的值 |
---|---|
STRING | 字符串、整数或者浮点数 |
LIST | 列表 |
SET | 无序集合 |
HASH | 包含键值对的无序散列表 |
ZSET | 有序集合 |
STRING
set key value 将字符串值 value 关联到 key ,如果 key 已经持有其他值, SET 就覆写旧值,无视类型。
get key 取key的值value
del key 删除key:删除操作成功 返回(integer)1;删除操作失败 返回(integer)0
高级命令:
mset k1 v1 k2 v2 k3 v3 ... 一次性添加或修改多个键值对
mget k1 k2 k3... 一次性获取k1 k2 k3...的value
strlen k 获取k对应的v的字符串长度
append k v 往k对应的v尾部追加数据,如果不存在就新建,这时候相当于set k v
自增自减操作控制数据库主键:
incr key 对应的value加1
decr key 对应的value减1
incrby key increment 对应的value+increment
decrby key increment 对应的value-increment
incrbyfloat key increment 对应的value+一个浮点数
数据库的热点数据key命名规范:
表名:主键名:主键值:字段名
LIST
内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的
lpush key value1 value2 ... 左侧插入
rpush key value1 value2 ... 右侧插入
lrange key start stop 从start开始到stop结束的下标的数据,索引从0开始,如果是负数结束,比如stop=-1,那就是截止到倒数第一个
lindex key index 找到index位置的数据
lpop key 移除并返回第一个元素
rpop key 移除并返回最后一个元素
llen 获取列表中元素个数
lrem key count value 删除list列表中number个value(因为list元素可以重复,所以要指定count) 1)当count>0时, lrem会从列表左边开始删除
2)当count<0时, lrem会从列表后边开始删除
3)当count=0时, lrem删除所有值为value的元素
ltrim key start stop 只保留列表中start开始到stop结束之间指定片段的数据
linsert key before|after pivot value 该命令首先会在列表中从左到右查找值为pivot的元素,然后根据 第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面
> rpush list-key item
(integer) 1
> rpush list-key item2
(integer) 2
> rpush list-key item
(integer) 3
> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"
> lindex list-key 1
"item2"
> lpop list-key
"item"
> lrange list-key 0 -1
1) "item2"
2) "item"
应用场景: 朋友圈评论,按顺序显示评论的朋友
SET
(1) 存储大量数据、查询速度快
(2) 集合中的数据是不重复且没有顺序
(3) 集合类型的Redis内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为0(1)
(4) 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,除此之外Redis还提供了多个集合之间的交集、并集、差集的运算。
hash和set的结构:
① hash: key-{field:value}
② set: key-{value:null}
sadd key value1 value2 ... 添加数据,如果重复添加,会添加失败
smembers key 获取全部数据
scard key 获取数据总量
srem key value 删除数据
sismember key value 判断value是否是key集合内的数据
> sadd set-key item
(integer) 1
> sadd set-key item2
(integer) 1
> sadd set-key item3
(integer) 1
> sadd set-key item
(integer) 0
> smembers set-key
1) "item"
2) "item2"
3) "item3"
> sismember set-key item4
(integer) 0
> sismember set-key item
(integer) 1
HASH
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持其它类型。
格式:一个存储空间(key)存储多个键值对,底层通过哈希表进行存储。
key {filed1 - v1, filed2 - v2,…}
注意:如果filed数量较少时,会被优化为类数组的结构,如果filed数量多,就是HashMap。
hset key field value 新增/修改某个field的v,新增时返回1,修改时返回0
hsetnx key field value 如果key中没有field字段则设置field值为value,否则不做任何操作
hget key field 获取某个field的v
hgetall key 获取这个key的所有f-v
hdel key field 删除某个field,可以删除一个或多个,返回值是被删除的字段个数
del key 删除整个key
hmset key f1 v1 f2 v2 f3 v3 ... 新增/修改某个field的f1、f2、f3,值分别为v1、v2、v3
hmget key f1 f2 f3... 获取某个field的f1、f2、f3 的值
hlen key 获取key的字段数量,就是field的数量
hexists key field 判断key中是否存在field这个字段
> hset hash-key sub-key1 value1
(integer) 1
> hset hash-key sub-key2 value2
(integer) 1
> hset hash-key sub-key1 value1
(integer) 0
> hdel hash-key sub-key2
(integer) 1
> hdel hash-key sub-key2
(integer) 0
> hget hash-key sub-key1
"value1"
注意事项
(1) hash类型的value只能存储string,不允许嵌套存储。如果获取不到对应的数据,返回的是(nil)。
(2) 每个hash最多存储2^32 -1 个键值对。
(3) hash最初设计不是为了存对象,不要把hash当成对象列表使用。
(4) hgetall 可以获取全部属性,如果field过多,遍历一次会很慢,影响程序效率。
应用场景
(1) 电商购物车:添加购物车、浏览购物车商品、更改购物车商品数量、删除商品、清空商品均可实现。
key : userID
field : 商品ID
value : 商品购买数量
演示案例
127.0.0.1:6379> hmset userid:1001 id 10011 name phone number 10
OK
127.0.0.1:6379> hmset userid:1002 id 10012 name xiaomi number 15
OK
127.0.0.1:6379> hgetall userid:1001
1) "id"
2) "10011"
3) "name"
4) "phone"
5) "number"
6) "10"
ZSET(有序集合)
zset使用散列表实现
如果添加重复的数据,score会被最后一次的覆盖
zadd key score1 value1 score2 value2.. --添加数据,向有序集合中加入一个元素和该元素的分数,如果该 元素已经存在则会用新的分数替换原有的分数
返回值是新加入到集合中的元素个数,不包含之前已经存在的元素
zrange key start stop [WITHSCORES] 获取数据按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素),
如果WITHSCORES在末尾,则会把score也输出出来
zrevrange key srart stop [WITHSCORES] 按照元素分数从大到小的顺序返回索引从start到stop之间的所有 元素,如果WITHSCORES在末尾,则会把score也输出出来。
zcard key 获取数据总量
zcount key min max 获取[min, max]范围内的数据数量
zrem key value 删除数据
> zadd zset-key 728 member1
(integer) 1
> zadd zset-key 982 member0
(integer) 1
> zadd zset-key 982 member0
(integer) 0
> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"
> zrem zset-key member1
(integer) 1
> zrem zset-key member1
(integer) 0
> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"
获取排名(索引)
zrank key value 获取value在key中的升序排名,score小的排在前面
zrevrank key value 降序排名
zscore key value 拿到value的score
zincrby key increment value 给value加上对应的increment
127.0.0.1:6379> zadd scores 30 a 50 b 10 c 35 d
(integer) 4
127.0.0.1:6379> zrank scores c <!--获取c 在key中的升序排名,score小的排在前面-->
(integer) 0
127.0.0.1:6379> zrevrank scores c <!--获取c 在key中的降序排名,score大的排在前面-->
(integer) 3
127.0.0.1:6379> zscore scores b <!--获取b 在key中的值 50-->
"50"
127.0.0.1:6379> zincrby scores 5 c