1) 基数统计(非精确去重统计) HyperLogLog, 统计一下数字

1
for ((i=0; i<200; i++)) { echo $i;   echo "pfadd goodhyperloglog $i" | redis-cli; } ; echo "pfcount goodhyperloglog" | redis-cli

在 Redis 里面,每个 HyperLogLog 键最坏情况下只需要花费 12k bytes ,就可以计算接近 2^64 个不同元素的基数
参考:redis#hyperloglog

2)Bitmaps 不是一个真实的数据类型,只是在String类型上定义的一系列的位操作。string是二进制安全的,最大长度512M,能存储2^32个bit位。参考redis#bitmap

1
for ((i=0; i<200; i++)) { echo $i;   echo "setbit bitkey $i 1" | redis-cli; } ; echo "bitcount bitkey" | redis-cli

这两个数据类型都可以用来做去重的统计,一个非精确快速 hyperloglog (单个计数器时间复杂度 O(1)),另外一个精确 bitcount 时间复杂度o(n)

  • 最大内存
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [work@xxxxx ~]$ ./redis/bin/redis-cli
    #最大可使用的内存是多少
    127.0.0.1:6379> config get maxmemory
    1) "maxmemory"
    2) "0"
    127.0.0.1:6379> config set maxmemory 100mb  #设置100M
    OK
    127.0.0.1:6379> config set maxmemory 0   #设置不限制
    OK
    127.0.0.1:6379> config get maxmemory
    1) "maxmemory"
    2) "0"    #在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存
  • 内存淘汰策略
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    127.0.0.1:6379> config get maxmemory-policy
    1) "maxmemory-policy"
    2) "noeviction"  #默认的redis内存淘汰策略,满了以后就放不进去了
    127.0.0.1:6379> config set maxmemory-policy allkeys-lru
    OK
    127.0.0.1:6379> config get maxmemory-policy
    1) "maxmemory-policy"
    2) "allkeys-lru"


    #noeviction(默认策略):对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外)
    #allkeys-lru:从所有key中使用LRU算法进行淘汰
    #volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
    #allkeys-random:从所有key中随机淘汰数据
    #volatile-random:从设置了过期时间的key中随机淘汰
    #volatile-ttl:在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰
    #当使用volatile-lru、volatile-random、volatile-ttl这三种策略时,如果没有key可以被淘汰,则和noeviction一样返回错误
  • 当前状态
  • 1
    2
    #基础监控返回内容参考 https://redis.io/commands/info
    127.0.0.1:6379> info
  • 数据持久化
  • 1
    2
    3
    4
    127.0.0.1:6379> save  #同步dump rdb文件,生产环境是禁用,导致阻塞
    OK
    127.0.0.1:6379> bgsave #异步
    Background saving started
  • 慢日志
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    127.0.0.1:6379> SLOWLOG LEN   #慢日志的长度
    (integer) 9
    127.0.0.1:6379> SLOWLOG GET 1  #获取一条慢日志
    1) 1) (integer) 8
       2) (integer) 1569908358
       3) (integer) 33015
       4) 1) "save"
    127.0.0.1:6379> SLOWLOG RESET  #慢日志重置,内存中的reset后永久丢失
    OK
  • 运维工具
  • Redis实用监控工具一览

    聊聊redis的监控工具

    1. 集群配置+proxy 不支持事务,不支持 script load 的情况下, 一种实现事务的方法。

    eval 执行是具有原子性的(https://redis.io/commands/eval#atomicity-of-scripts) 但是 得注意 cluster的环境下
    用eval 执行多语句,遇到多个key的情况
    (error) CROSSSLOT Keys in request don’t hash to the same slot
    一个可以用的方案: https://redis.io/topics/cluster-spec#keys-hash-tags

    eval(script) 组装一个脚本,但是多个key必须用 keys hash tags的方法到一个slot里面,代理只会按照第一个key的hash来。

    2. redis 大厂解决方案
    https://www.cnblogs.com/me115/p/9043420.html
    很有必要参考,这个大厂确实是这么做的。开发过程中坑位很多。