用户工具

站点工具


linux:redis

开发建议

redis事故分析

  1. 冷热数据分离,不要将所有数据全部都放到Redis中
    低频冷数据可以使用MySQL/ElasticSearch/MongoDB等基于磁盘的存储方式
  2. 不同的业务数据要分开存储
    使用redis代理或者是分布式方案来提升redis的CPU使用率
  3. 存储的Key一定要设置超时时间
    Key的超时长短要根据业务综合评估
  4. 对于必须要存储的大文本数据一定要压缩后存储
    对于大文本【+超过500字节】写入到Redis时,一定要压缩后存储
  5. 线上Redis禁止使用Keys正则匹配操作
    请使用scan命令代替
  6. 可靠的消息队列服务
    Redis提供了RPOPLPUSH命令,消费者程序会原子性的从主消息队列中取出消息并将其插入到备份队列中,直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。同时还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。
  7. 谨慎全量操作Hash、Set等集合结构
  8. 根据业务场景合理使用不同的数据结构类型
    String可以用作普通的K-V、计数类;Hash可以用作对象如商品、经纪人等,包含较多属性的信息;List可以用作消息队列、粉丝/关注列表等;Set可以用于推荐;Sorted Set可以用于排行榜等
  9. 命名规范
    系统名:业务名:业务数据:其他但是注意,key的名称不要过长,尽量清晰明了,容易理解
  10. 线上禁止使用monitor命令
    monitor命令在高并发条件下,会存在内存暴增和影响Redis性能的隐患
  11. 禁止大string
    核心集群禁用1mb的string大key(虽然redis支持512MB大小的string),如果1mb的key每秒重复写入10次,就会导致写入网络IO达10MB;
  12. redis容量
    单实例的内存建议在10~20GB以内。redis实例包含的键个数建议控制在1kw内
  13. 可靠性
    使用各种redis健康监控工具,实在不行可以定时返回redis 的 info

常用命令

redis-cli --help
-h host
-p port
-a pwd #FoaleeMeecHaith2CojaJae2
-n db
redis-cli -n 1 keys "prefix*" | xargs -tl -i redis-cli -n 1 expire "{}" 3600
redis-cli -a pwd keys "prefix*" | xargs -tl -i redis-cli -a pwd del "{}"

redis.clients:jedis:3.3.0

Redis官方推荐的Java连接库

Jedis jedis=new Jedis(host,port);
JedisPool pool=new JedisPool(new JedisPoolConfig(),host,port);
Jedis jedis=pool.getResource(); //get publish subscribe lpush rpop

org.redission:redission:3.5.4

基于Netty提供常用工具类简化分布式开发

Config config = new Config();
config.useSingleServer().setAddress("redis://host:port");
RedissonClient redissonClient = Redisson.create(config);
RSetCache<V> getSetCache(String name); //rset.add(V value, long ttl, TimeUnit unit),集合元素支持超时
RMapCache<K, V> getMapCache(String name); //rmap.putIfAbsent(K key, V value, long ttl, TimeUnit ttlUnit)

io.lettuce:lettuce-core:5.1.6.RELEASE

org.springframework.boot:spring-boot-starter-data-redis:2.1.4.RELEASE

spring.redis.lettuce.pool.minIdle=1 //RedisProperties.Lettuce
RedisTemplate.setConnectionFactory(LettuceConnectionFactory connectionFactory)
redisTemplate.opsForList().leftPush("two", "two", "two1")

redis-cli

config get * // 获取所有配置 daemonize pidfile port bind timeout loglevel logfile databases maxclients 
config set rdbcompression no // 关闭压缩后可节省CPU时间,但数据库文件会变巨大
set key string // string类型二进制安全,支持图片或序列化对象等,最大512M,get key获取值
setex key seconds string // 设置超时seconds秒,psetex key millis string,设置超时毫秒
hmset user:1 name Name age 18 // hash类型是field:string映射,特别适合存储对象,最多2^32-1个约40亿字段
hgetall user:1 // hget map field获取某个字段,hset map field value设置某个字段
lpush list string // list类型对应列表,允许重复,rpush list value,右侧入队
lrange list 0 10 // 按范围取出元素,lrem list count value,删除count个value元素,help lpop,元素出栈
sadd key member // set类型为无序集合,不允许重复,scard set大小,sismember set member包含,spop set随机弹出
srandmember set count // 随机抽取count个元素,sdiff set1 set2差集,sinter交集,sunion并集,smove set1 set2 value移动
zadd key score value // zset为有序集合,支持double分数,zcard key大小,zcount key min max个数,
zrange key 0 10 // 升序前十,zrevrange key 0 10 withscores降序带分数,zscore key member分数,zincrby key delta member变更分数
  • redis用作消息队列:list是拉模型,pubsub是推模型,stream是移植disque的专用消息队列
    • lpush queue msg,rpop queue,问题:队列空时,弹出NULL,若频繁拉取既增加redis负载又浪费CPU,若sleep又消费不及时
    • brpop queue,无消息时阻塞,但阻塞太长可能被redis踢下线,因此客户端要有重连机制,问题:不支持重复消费,宕机会丢消息
    • subscribe queue,publish queue msg,支持重复消费:多个消费者都会收到消息,psubscribe queue.*,支持匹配订阅多个队列,问题:丢数据(消费者下线,redis宕机,消息堆积:消费者有缓存区可配置,消费速度慢时会积压,达到上限时会被踢,client-output-buffer-limit pubsub 32mb 8mb 60,上限32M或超过8M并持续60秒会被踢),因为redis只做了消息实时转发,没有任何存储。
    • xadd queue * name value,*表示自动生成消息ID:时间戳-自增序号,xread count 5 streams queue 0-0,0-0表示从头开始,传消息ID表示从指定消息开始,空时返回NULL。阻塞消费需加block:xread count 5 block queue 0-0
    • xgroup create queue group1 0-0,创建消费组,xreadgroup GROUP group1 CONSUMER COUNT 5 STREAMS queue >,消费数据,>表示消费最新数据,多个消费者都可以消费此组。xack queue group1 0-0,标记消息已消费,stream数据会写入rdb和aof,重启后可恢复未消费的消息。xadd queue MAXLEN 10000 * name value,发布消息时指定最大长度,避免内存溢出
linux/redis.txt · 最后更改: 2022/03/02 09:50 由 admin