redis_01_常用数据类型以及使用场景
一、特性
1. 快
redis基于内存操作,不需要与磁盘交互,而DB则需要与磁盘交互。 redis的命令执行是单线程,通信采用多路复用 redis是k-v结构,时间复杂度近O(1) redis底层的数据结构,支持跳表、SDS lO多路复用,单个线程中通过记录跟踪每一个sock(I/O流) 的状态来管理多个I/O流
2. 支持多语言
3. 多集群、高可靠、高可用
4. 完善的内存管理机制,如:淘汰策略、过期策略
5. 丰富的数据类型
二、常用基本指令
1、keys
127.0.0.1:6379> keys *
1) "elevenfloat"
2) "queue"
3) "elevenint"
4) "eleven"
5) "k"
用于查找所有符合给定模式 pattern 的 key
2、type
127.0.0.1:6379> type k
string
用于返回 key 所储存的值的类型
3、ttl
127.0.0.1:6379> ttl k
(integer) 98
以秒为单位返回 key 的剩余过期时间
4、rename
127.0.0.1:6379> rename k knew
OK
修改 key 的名称
5、exists
127.0.0.1:6379> exists k
(integer) 1
用于检查给定 key 是否存在
6、persist
127.0.0.1:6379> persist k
(integer) 1
127.0.0.1:6379> ttl k
(integer) -1
用于移除给定 key 的过期时间,使得 key 永不过期
三、数据类型
1、String
基本指令
(1)set
127.0.0.1:6379> set smile eleven
OK
设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型 (2)get
127.0.0.1:6379> get knew
"1"
获取指定 key 的值 (3)mset
127.0.0.1:6379> MSET key1 "Hello" key2 "World"
OK
同时设置一个或多个 key-value 对 (4)incr
127.0.0.1:6379> set keyincr 17
OK
127.0.0.1:6379> incr keyincr
(integer) 18
127.0.0.1:6379> get keyincr
"18"
将 key 中储存的数字值增一 (5)incrby
127.0.0.1:6379> incrby keyincr -1
(integer) 17
将 key 所储存的值加上给定的增量值 (6)setnx
127.0.0.1:6379> set smile eleven
OK
如果键不存在,则将键设置为保存字符串值。在这种情况下,它等于 SET。当 key 已经持有值时,不进行任何操作。 SETNX 是“SET if Not eXists”的缩写
应用场景
incr可以做分布式自增ID; set get 可以缓存,比如:request——>db改成 request——>redis——>db
2、Hash
基本指令
(1)hset
127.0.0.1:6379> hset myhash age 10 name smile
(integer) 2
用于为哈希表中的字段赋值 (2)hget
127.0.0.1:6379> hget myhash age
"10"
用于返回哈希表中指定字段的值 (3)hkeys
127.0.0.1:6379> hkeys myhash
1) "age"
2) "name"
用于获取哈希表中的所有字段名 (4)hexists
127.0.0.1:6379> hexists myhash age
(integer) 1
用于查看哈希表的指定字段是否存在 (5)hgetall
127.0.0.1:6379> hgetall cart:001
1) "3001"
2) "2"
3) "3002"
4) "3"
用于返回哈希表中,所有的字段和值 (6)hincrby
127.0.0.1:6379> hincrby cart:001 3002 4
(integer) 7
用于为哈希表中的字段值加上指定增量值
应用场景
购物车 用户001添加商品3001,数量2;商品3002 数量3
127.0.0.1:6379> hset cart:001 3001 2
(integer) 1
127.0.0.1:6379> hset cart:001 3002 3
(integer) 1
商品全选 hgetall 商品种类添加 hset 删除 hdel 商品数量增减 hincrby
统计PV、UV 使用hset、hexists、hincrby
缓存对象类型数据 使用hset、hget
3、List
存储有序的字符串列表,元素可以重复
基本指令
(1)lpush
127.0.0.1:6379> lpush eleven_queue a c
(integer) 2
将一个或多个值插入到列表头部 (2)rpush
127.0.0.1:6379> rpush eleven_queue b d
(integer) 4
将一个或多个值插入到列表尾部 (3)lrange
127.0.0.1:6379> lrange eleven_queue 0 -1
1) "c"
2) "a"
3) "b"
4) "d"
获取列表指定范围内的元素 (4)lpop
127.0.0.1:6379> lpop eleven_queue
"c"
删除并返回存储在 key 的列表的第一个元素。
默认情况下,该命令从列表的开头弹出一个元素。当提供可选的 count 参数时,回复将包含多达 count 个元素,具体取决于列表的长度 (5)rpop
127.0.0.1:6379> rpop eleven_queue
"d"
删除并返回存储在 key 的列表的最后一个元素。 默认情况下,该命令从列表末尾弹出一个元素。当提供可选的 count 参数时,回复将包含多达 count 个元素,具体取决于列表的长度 (6)blpop
127.0.0.1:6379> blpop eleven_bqueue 1
1) "eleven_bqueue"
2) "f"
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 (7)brpop
127.0.0.1:6379> brpop eleven_bqueue 1
1) "eleven_bqueue"
2) "a"
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止
应用场景
时间轴 比如:朋友圈、博客时间轴、项目规划时间轴。
127.0.0.1:6379> lpush eleven_queue_test 周一
(integer) 1
127.0.0.1:6379> lpush eleven_queue_test 周二
(integer) 2
127.0.0.1:6379> lpush eleven_queue_test 周四
(integer) 3
阻塞队列 使用blpop、brpop。但是鉴于市面有成熟完善的MQ,不建议使用redis,因为redis是内存型数据库,可能有数据丢失,消费后没有响应机制,没有ack机制。
4、Set
String类型的无序集合,最大存储数量 2^32-1(40 亿左右)。 并且他们的 添加、删除元素的时间都是O(1)
基本指令
(1)sadd
127.0.0.1:6379> sadd eleven_set a b c
(integer) 3
向集合添加一个或多个成员 (2)spop
127.0.0.1:6379> spop eleven_set
"a"
移除并返回集合中的一个随机元素 (3)smembers
127.0.0.1:6379> smembers eleven_set
1) "c"
2) "b"
返回集合中的所有成员(第一次获取的结果集,以后每次获取一样,即:插入随机,获取固定) (4)scard
127.0.0.1:6379> scard eleven_set
(integer) 2
获取集合的成员数 (5)sdiff
127.0.0.1:6379> sadd eleven_set2 b f
(integer) 2
127.0.0.1:6379> sdiff eleven_set eleven_set2
1) "c"
返回由第一个集合和所有后续集合之间的差异产生的集合成员。 (6)sunion
127.0.0.1:6379> sunion eleven_set eleven_set2
1) "c"
2) "f"
3) "b"
返回由所有给定集合的并集得到的集合成员。 (7)sinter
127.0.0.1:6379> sinter eleven_set eleven_set2
1) "b"
返回给定所有集合的交集
应用场景
抽奖(不可重复) 使用spop 随机弹出或获取元素
抽奖(可重复) 使用srandmember随机弹出或获取元素 集合交集、并集、差集 交集:共同好友; 差集:可能认识的人 统计网站的独立IP 利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP 点赞、签到、标签 点赞:sadd like:消息ID 用户ID 取消点赞:srem like:消息ID 用户ID 检查用户是否点过赞:sismember like:消息ID 用户ID 获取点赞列表: smembers like:消息ID
5、Sorted Set
sorted set,有序的set,每个元素有个score。
(1)zadd
127.0.0.1:6379> zadd eleven_zset 10 a 20 b 30 c
(integer) 3
向有序集合添加一个或多个成员,或者更新已存在成员的分数 (2)zcard
127.0.0.1:6379> zcard eleven_zset
(integer) 3
获取有序集合的成员数 (3)zcount
127.0.0.1:6379> zcount eleven_zset 15 25
(integer) 1
计算在有序集合中指定区间分数的成员数 (4)zrange
127.0.0.1:6379> zrange eleven_zset 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> zrange eleven_zset 0 -1 withscores
1) "a"
2) "10"
3) "b"
4) "20"
5) "c"
6) "30"
通过索引区间返回有序集合成指定区间内的成员 (5)zrevrange
127.0.0.1:6379> zrevrange eleven_zset 0 -1 withscores
1) "c"
2) "30"
3) "b"
4) "20"
5) "a"
6) "10"
返回有序集中指定区间内的成员,通过索引,分数从高到底 (6)zrevrangebyscore
127.0.0.1:6379> zrevrangebyscore eleven_zset 25 15
1) "b"
返回有序集中指定分数区间内的成员,分数从高到低排序
应用场景
排行榜、热搜 使用zrevrange 倒序
四、补充
BitMap 位图 底层是位运算 (00000101010) 基本指令 setbit 添加 bitcount 统计 getbit查看 应用场景 实时统计数据、权限。
- 感谢你赐予我前进的力量