redis命令参考
什么是缓存穿透?击穿?雪崩?如何解决?
java分布式锁使用redisson
1.底层
-
list 底层是链表
-
set底层是HashTable
-
- 编码
zset的编码有ziplist和skiplist两种。
底层分别使用ziplist(压缩链表)和skiplist(跳表)实现。
什么时候使用ziplist什么时候使用skiplist?
当zset满足以下两个条件的时候,使用ziplist:
保存的元素少于128个
保存的所有元素大小都小于64字节不满足这两个条件则使用skiplist。
(注意:这两个数值是可以通过redis.conf的zset-max-ziplist-entries 和 zset-max-ziplist-value选项 进行修改。) - 编码
2. 场景
大量访问的数据
不经常改动的数据
- 记录帖子的点赞数、评论数和点击数(hash)。
- 记录用户的帖子 ID 列表(排序),便于快速显示用户的帖子列表(zset)。
- 记录帖子的标题、摘要、作者和封面信息,用于列表页展示(hash)。
- 记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数(zset)。
- 缓存近期热帖内容(帖子内容的空间占用比较大),减少数据库压力(hash)。
- 记录帖子的相关文章 ID,根据内容推荐相关帖子(list)。
- 如果帖子 ID 是整数自增的,可以使用 Redis 来分配帖子 ID(计数器)。
- 收藏集和帖子之间的关系(zset)。
- 记录热榜帖子 ID 列表、总热榜和分类热榜(zset)。
- 缓存用户行为历史,过滤恶意行为(zset、hash)
- 固定集合(capped collection):LPUSH+LTRIM
消息队列:LPUSH+BRPOP
1. 缓存
string,hash
2.队列(不适合高可靠)
list(普通级和优先级队列.异步消息队列)
zset(优先级队列,延时队列)
hash(延时队列)
3. 去重
set(小批量数据去重)
string的bitop(可以实现布隆过滤器,实现超大规模数据去重)
HyperLogLog,可以实现超大规模数据去重和计数
4. 积分板
zset,自动排序,排名
5.发布/订阅
Pub/Sub可以实现多对多
3. redis client
1. redigo
- 获取多种类型的值:
redis.Values()
redis.Scan() //获取常见类型 - 获取自定义类型:
c := pool.Get()
defer c.Close()
//c, err := redis.Dial("tcp", ":6379")
//if err != nil {
// fmt.Println("conn redis failed", err)
// return
//}
var types []ArticleType
rel, err := redis.Bytes(c.Do("get", "types"))
if err != nil {
fmt.Println("获取redis数据错误")
return
}
decoder := gob.NewDecoder(bytes.NewReader(rel))
err = decoder.Decode(&types)
if len(types) == 0 {
//从MySQL取数据
var buffer bytes.Buffer
encoder := gob.NewEncoder(&buffer)
err := encoder.Encode(types)
_, err = c.Do("set", "types", buffer.Bytes())
if err != nil {
fmt.Println("redis set failed"