redis底层原理该如何回答(【Redis技术探索】「底层架构原理」探索分析服务核心数据结构介绍和案例)
导读:Redis常用存储类型 Redis底层提供了5种数据结构:...
Redis常用存储类型
Redis底层提供了5种数据结构:字符串 、哈希 、列表 、集合 、有序集合
下图非常形象的表示了数据结构:
字符串String
常用命令
EX seconds:设置失效时长 ,单位秒 PX milliseconds:设置失效时长 ,单位毫秒 NX:key不存在时设置value,成功返回OK ,失败返回(nil) XX:key存在时设置value ,成功返回OK ,失败返回(nil)SET key value [EX seconds] [PX milliseconds] [NX|XX]
批量存储字符串键值对 MSET key value [key value...] 设置一个不存在的key SETNX key value 获取key对应的value GET key 批量获取字符串键值 MGET key [key...] 删除一个键 DEL key [key...] 设置一个键的过期时间(秒) EXPIRE key seconds 原子操作 将key中储存的数字值加1 INCR key 将key中储存的数字值减1 DECR key 将key中储存的数字值加increment INCRBY key increment 将key中储存的数字值减decrement INCRBY key decrementString应用场景
单值存储
SET sentinel:status 1 GET sentinel:status对象存储
JSON格式 SET user:1001 {"userId":1001, "userName":"张三", "age":28} GET user:1001 MSET user:1001:name 张三 user:1001:age 28 MGET user:1001:name user:1001:age分布式锁
返回1表示获取锁成功 ,返回0表示获取锁失败
SET lock:product:100001 1 EX 30 NX处理成功后释放锁
DEL lock:product:100001计数器
INCR article:readcount:18021 // 文章id为18021阅读数量+1 GET article:readcount:18021 // 查询文章id为18021阅读数量 DECR product:count:100001 // 产品id为100001库存-1 GET product:count:100001 // 查询产品id为100001库存Web集群Session共享
SET sessionId {"userId":1001,"name":"张三","auth":""}分布式全局主键id
INCRBY order:ids 1000 // 给订单服务生成1000个主键id哈希Hash
存储一个哈希表key的键值
HSET key field value存储一个不存在的哈希表key的键值
HSETNX key field value存储多个哈希表key的键值
HMSET key field value [field value ...]获取哈希表key对应的field键值
HGET key field批量获取哈希表key中多个field键值
HMGET key field [field ...]批量删除哈希表key中的field键值
HDEL key field [field ...]返回哈希表key中field的数量
HLEN key返回哈希表key中所有的键值
HGETALL key删除key ,整个hash表全部删除
DEL key为哈希表key中field键的值加上增量increment
HINCRBY key field incrementhash应用场景
存储对象 hmset userinfo id:1001:name 张三 id:1001:age 28 hmget userinfo id:1001:name id:1001:age hmset user:1001 id 1001 name 张三 age 28 expire user:1001 30 hgetall user:1001 电商购物车用户id为key ,商品id为field ,商品数量为value
添加商品 hset cart:user:1001 10088 1 hset cart:user:1001 10072 1 hset cart:user:1001 10192 1 商品增加数量 hincrby cart:user:1001 10088 1 获取商品总数 hlen cart:user:1001 删除商品 hdel cart:user:1001 10072 查询商品列表 hgetall cart:user:1001 hash优缺点 优点同类数据归类整合储存 ,方便数据管理 ,相比string操作消耗内存与cpu更小,相比string储存更节省空间
缺点过期功能只能设置在key上 ,无法对field单独设置key ,一个key不能存太多的field
List集合
常用操作
list列表左边依次插入一个或多个value LPUSH list value [value ...] list列表右边依次插入一个或多个value RPUSH list value [value ...] 移除list列表最左边的元素并返回 LPOP list 移除list列表最右边的元素并返回 RPOP list 返回列表list中指定区间内的元素,区间以偏移量start和stop指定 LRANGE list start stop 从list列表中弹出最左边的元素 ,如果list为空则阻塞timeout秒 BLPOP list [timeout] 从list列表中弹出最右边的元素 ,如果list为空则阻塞timeout秒 BRPOP list [timeout][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9UYjlSrn-1671096099930)(null)]
list实现数据结构
栈(FILO):LPUSH + LPOP 或 RPUSH + RPOP 队列(FIFO):LPUSH + RPOP 或 RPUSH + LPOP 阻塞队列:LPUSH + BRPOP或RPUSH+BLPOPlist应用场景
消息队列利用list的LPUSH + BRPOP实现一个消息队列,故而可以实现一个简单的点对点消息队列
点赞用户列表利用RPUSH + LRANGE组合实现点赞用户列表功能
消息推送利用LPUSH + LRANGE组合实现消息推送功能
Set集合
常用操作
往集合key中存入一个或多个元素 ,元素存在则忽略 ,元素不存在则存入 SADD key [member] [member...] 从集合key中移除一个或多个元素 ,不存在的元素则忽略 SREM key [member] [member...] 获取集合key中所有元素 SMEMBERS key 获取集合key总个数 SCARD key 判断member元素在key集合中是否存在 SISMEMBER key member 从集合key中随机选择出count个元素 ,元素不从集合key中删除 SRANDMEMBER key [count] 从集合key中移除随机count个元素 SPOP key [count] 多个集合求交集 SINTER key [key...] 将交集结果存入destination集合中 SINTERSTORE destination key1 [key2] 将交集结果存入destination集合中 SUNION key1 [key2] 将并集结果存入destination集合中 SUNIONSTORE destination key1 [key2] 差集运算 SDIFF key1 [key2] 将差果存入destination集合中 SDIFFSTORE destination key1 [key2]应用场景
抽奖小程序 奖品id为1001的抽奖添加10293用户 SADD draw:prizes:1001 10293 查看所有参与抽奖用户 SMEMBERS draw:prizes:1001 抽奖 SPOP draw:prizes:1001 SPOP draw:prizes:1001 N 点赞 、收藏功能 收藏 用户id为29102收藏了文章id为1001 SADD collect:article:1001 29102 取消收藏 用户id为29102取消收藏文章id为1001 SREM collect:article:1001 29102 检查用户是否收藏 SISMEMBER collect:article:1001 29102 获取收藏的用户列表 SMEMBERS collect:article:1001 获取收藏用户数 SCARD collect:article:1001ZSet有序集合
常用操作
向有序集合添加一个或多个成员 ,或者更新已存在成员的分数 ZADD key score1 member1 [score2 member2] 从有序集合key中删除key ZREM key member [member...] 返回有序集合key中元素member的分值 ZSCORE key member 为有序集合key中元素member的分值加上increment ZINCRBY key increment member 返回有序集合key中元素个数 ZCARD key 正序获取有序集合key从start下标到stop下标的元素 ZRANGE key start stop [WITHSCORES] 倒序获取有序集合key从start下标到stop下标的元素 ZREVRANGE key start stop [WITHSCORES] 并集计算 ZUNIONSTORE destkey numkeys key [key ...] 交集计算 ZINTERSTORE destkey numkeys key [key ...]应用场景
排行榜功能 文章id10001在20210426日被点击一次 ZINCRBY hotnews:20210426 1 10001 展示当天热点前十新闻 ZREVRANGE hotnews:20210426 0 10 WITHSCORES 七日搜索榜单计算 ZUNIONSTORE hotnews:20210426-20210502 hotnews:20210426 hotnews:20210427 ... hotnews:20210502 展示七日排行前十 ZREVRANGE hotnews:20210426-20210502 0 10 WITHSCORESRedis为什么每秒支持10w并发
单线程设计 ,避免线程上下文切换 基于内存操作运算 使用IO多路复用技术实现对多个并发请求的响应创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!