多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 1. String (字符类型) ``` set key 1 get key INCR key DECR key 追加 append key 33 4 字符长度 strlen key ``` 使用场景 使用的是最多的, 像保存登录人信息, 保存验证码, 保存流水号, 像字符串的递增数值 INCR key 和 递减数值 DECR key 可以用来做 播放量 阅读量等 ## 2. Hash (散列类型) ``` 结构类似 Map<String, Map<Object, Object>> 多个的时候 有个m hset name key1 value1 hget name key2 获取key中的一个值 hmset name key1 value1 key2 value2 hmget name key1 key2 获取key中的多个值 hgetall name 获取key的所有值 hdel name key1 hlen name 获取key的全部数量 hdel name 增量是1 hset age 张三 18 hincrby age 张三 1 就从18变成19了 hincrby age 张三 -1 就从19变回18了 ``` 使用场景:购物车 shopCar:uid + 用户id 做key 新增商品:hset shopCar:uid111 555 1 再新增商品:hset shopCar:uid111 556 1 购物车现有商品数量增加1个: hincrby shopCar:uid111 555 1 总数: hlen shopCar:uid111 全选: hgetall shopCar:uid111 ## 3. List (列表类型) 按照添加顺序保存, 可做排序的业务, 相当于按照添加时间倒序保存的 尽量不要做分页, 因为当添加的数据过快, 原来是在第一页显示, 后来有添加了数据, 就会导致之前第一页显示的, 又在第二页 或第n页再显示。后面的数据一直在添加, 这样原来是最新的数据, 就变成旧数据了, 页码里的数据也就会重复了 ``` 在 key 对应 list 的头部添加字符串元素 lpush name value 在 key 对应 list 的尾部添加字符串元素 rpush name value 返回 key 对应 list 的长度 llen name 读取列表 lrange name 0 9 ``` 使用场景: 商品足迹 lpush 商品足迹:userId 商品id1 商品id2 使用场景:订阅号 lpush likeArticle:userId 文章id1 文章id2 文章id3 // 前 10 条 lrange likeArticle:userId 0 9 ## 4. Set (集合类型) ``` 集合差集 属于A但不属于B SDIFF keyA keyB [key...] 集合交集 属于A同时也属于B SINTER keyA keyB [key...] 集合并集 属于A或者属于B的元素合并后的集合 SUNION keyA keyB [key...] 添加 SADD name value 移除集合中一个或多个成员 SREM name value[value2] 获取key 的全部成员 smembers name 获取key 的总数 scard key 随机选择n个元素, 元素不删除 srandmember key n 随机选择n个元素, 元素会删除 spop key n 判断 value 元素是否是集合 key 的成员 SISMEMBER key value ``` 使用场景:抽奖 srandmember key n 和 spop key n 用作抽奖 如 奖品是一个手机 则key是手机id, value 则是一个个用户id 使用场景:点赞 sadd like:videoId userId1 userId2 userId3 新增点赞 srem like:videoId userId3 删除点赞 smembers like:videoId 点赞用户列表 scard like:videoId 点赞总数 sismember like:videoId userId2 判断某个用户是否点赞 使用场景:关注 sadd follow:meFollow:11 2 3 5 6 19 我关注的 sadd follow:followMe:11 5 14 16 9 关注我的 sadd follow:followMe:2 15 14 36 19 关注用户 2 的 sadd follow:meFollow:2 5 33 45 99 用户 2 关注的 SINTER follow:meFollow:11 follow:followMe:11 我关注他, 他也关注我 SINTER follow:meFollow:11 follow:meFollow:2 11和 2 共同关注的 SINTER follow:meFollow:11 follow:followMe:2 我关注的人, 同时也关注他 (用户11 关注用户19 和 用户2, 同时用户19也关注 用户2) 使用场景:qq 内推 可能认识的人 使用 SDIFF keyA keyB 或者 SDIFF keyB keyA 互相取差集 ## 5. SortedSet(有序集合 简称 zset) 做排序分页 ``` 添加一个元素和该元素的分数 分数在前(score) zadd key score member zadd code 1 java zadd code 2 css zadd code 3 html 按照分数从小到大的顺序 返回索引从start 到 stop之间的元素 zrange key start stop [WITHSCORES] zrange code 0 2 WITHSCORES 获取元素的分数 zscore key member 删除 元素 zrem key member 获取指定分数范围的元素 zrangebyscore key min max [WITHSCORES] [limit offset count] 获取指定分数范围的元素 前5个 zrangebyscore key min max limit 0 5 增加某个元素的分数 zincrby key increment member zincrby key 5 member 增加5分 获取集合中元素的数量 zcard key 获取指定分数范围内的元素个数 zcount key min max 按照排名范围删除元素 zremrangebyrank key start stop 从小到大排名 zrank key member 从大到小排名 zrevrank key member ``` 使用场景: 排行榜 热搜 zadd goods:sell 20 1111 50 2222 商品 1111 售出20 , 商品2222 售出 50 zrange goods:sell 0 9 withscores 前10 zincrby goods:sell 3 1111 商品 1111 又售出3 实战: 抖音面试题=> 获取抖音视频最新评论留言 涉及排序 分页 高并发 可以使用 list 和 zset list 做分页可能会导致分页数据重复, 因为每次添加都会顶到最前面 zset 把时间戳到分数, 视频id 做值 zadd 抖音视频最新评论 时间戳 视频id 时间戳 视频id zrank zrevrank 进行从小到大和从大到小排序 ## 6. Bigmap(位图) ``` 给指定 key 的值 的第 offset 赋值val setbit key offset val 获取指定 key 的第offset位 getbit key offset 返回指定 key 中 [start, end] 中为1的数量 bitcount key start end 对不同的二进制存储数据进行位运算(AND OR NOT XOR) bigop operation destkey key ``` bigmap 支持位数是2的32次方位, 512m大小 由0和1状态表现的二进制位的big数组 , 从0开始 底层是用String实现, get 命令也能获取, 获取道德是 ascii码 strlen 获取长度时, 每8位是一个长度 setbit key 6 0 使用 strlen key 获取的长度是1 setbit key 23 0 使用 strlen key 获取的长度是3 setbit key 364 0 使用 strlen key 获取的长度是46 场景: 用于状态统计, 用户是否登录过, 如京东每日签 到送京豆, 电影、广告是否被点击播放过 钉钉打卡上下班, 签到统计 日活统计 连续签到打卡 最近一周的活跃用户 统计指定用户一年中的登录天数 某用户按照一年365天, 哪几天登陆过 签到:mysql 也能做, 数据量小可以用,数据量大了就算了。 按月=> key =>业务前缀:用户id:年月 , 从0开始 0 未签到, 1签到了 setbig sign:uid1:202101 0 1 2021年1月1日 签到了 setbig sign:uid1:202101 1 1 2021年1月2日 签到了 setbig sign:uid1:202101 20 1 2021年1月21日 签到了 getbit sign:uid1:202101 0 判断 2021年1月1日 是否签到 这个返回1 getbit sign:uid1:202101 10 判断 2021年1月11日 是否签到 这个返回0 bigcount sign:uid1:202101 2021年1月签到总数 bigcount sign:uid1:202101 0 9 2021年1月1日到10日 签到总数 按年=> key =>业务前缀:用户id:年 , 从0开始 setbig sign:uid1:2021 0 1 2021年第一天 签到了 setbig sign:uid1:2021 364 1 2021年第365天 签到了 其他和按月的一样, 就是key变了 ## 7. HyperLogLog(统计) 1\. 去重复 2\. 不直接存储数据本身 3\. 通过牺牲准确率来换取空间, 它不准确 UV(Unique visitor):指通过互联网访问、浏览这个网页的自然人。00:00-24:00 同一个访客多次访问算一次 PV(Page View):浏览量或点击量 VV(Visit View):访客1天内访问网站的次数。 DAU:daily active user(日活跃用户) MAU:monthly active user(月活跃用户) PV与VV区别:PV是指页面的浏览次数,VV是指你访问网站的次数。 统计某个网站的UV 统计某个文章的UV 用户搜索网站关键词的数量 统计用户每天搜索不同词条个数 基数统计:统一一个集合中不重复的元素个数 基数:是一种数据集,去重复后的真实个数 ``` 将所有元素添加到 key 中 pfadd key element1 element2 element3 统计 key 的估算值(不精确) pfcount key 合并去重 key 至新key pgmerge new_key key1 key2 ``` 8. GEO(地理) geo 本质是 zset type key 会返回zset ``` 添加地理位置的坐标 geoadd key longitude latitude member [longitude latitude member ...] 获取地理位置的坐标 geopos key member [member ...] 计算两个位置之间的距离 geodist key member1 member2 [m|km|ft|mi] 根据用户给定的经纬度坐标来获取指定范围内的地理位置集合,用的最多, 像外卖平台的 查找多少km内的的商家 georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] 根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合 georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key] 返回一个或多个位置对象的 geohash 值 geohash key member [member ...] ``` [https://www.runoob.com/redis/redis-geo.html](https://www.runoob.com/redis/redis-geo.html) geo 命令