1. 控制 key 的长度
  2. 避免存储 bigkey
  3. 选择合适的数据类型
  4. 把 Redis 当作缓存使用
  5. 实例设置 maxmemory + 淘汰策略
  6. 数据压缩后写入 Redis

    使用场景

  • 缓存
  • 分布式锁
  • 计数器
  • 打卡
  • 排行榜

    key名设计

    1. ugc:video:1

    使用连接池

    1. Jedis jedis = null;
    2. try {
    3. jedis = jedisPool.getResource();
    4. //具体的命令
    5. jedis.executeCommand()
    6. } catch (Exception e) {
    7. logger.error("op key {} error: " + e.getMessage(), key, e);
    8. } finally {
    9. //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
    10. if (jedis != null)
    11. jedis.close();
    12. }

    Redis 客户端

  • Java: Jedis, Lettuce, Redisson

  • C/C++: hiredis, redis-plus-plus
  • Python: redis-py
  • Go: Redigo

Redis 分布式锁

  1. public boolean setnx(String key, String val) {
  2. Jedis jedis = null;
  3. try {
  4. jedis = jedisPool.getResource();
  5. if (jedis == null) {
  6. return false;
  7. }
  8. return jedis.set(key, val, "NX", "PX", 1000 * 60).equalsIgnoreCase("ok");
  9. } catch (Exception ex) {
  10. } finally {
  11. if (jedis != null) {
  12. jedis.close();
  13. }
  14. }
  15. return false;
  16. }
  1. public int delnx(String key, String val) {
  2. Jedis jedis = null;
  3. try {
  4. jedis = jedisPool.getResource();
  5. if (jedis == null) {
  6. return 0;
  7. }
  8. //if redis.call('get','orderkey')=='1111' then return redis.call('del','orderkey') else return 0 end
  9. StringBuilder sbScript = new StringBuilder();
  10. sbScript.append("if redis.call('get','").append(key).append("')").append("=='").append(val).append("'").
  11. append(" then ").
  12. append(" return redis.call('del','").append(key).append("')").
  13. append(" else ").
  14. append(" return 0").
  15. append(" end");
  16. return Integer.valueOf(jedis.eval(sbScript.toString()).toString());
  17. } catch (Exception ex) {
  18. } finally {
  19. if (jedis != null) {
  20. jedis.close();
  21. }
  22. }
  23. return 0;
  24. }

发布订阅

  1. private static String CHANNEL = "didispace";
  2. private RedisTemplate<String, String> redisTemplate;
  3. redisTemplate.convertAndSend(CHANNEL, message);
  1. RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection();
  2. redisConnection.subscribe(new MessageListener() {
  3. @Override
  4. public void onMessage(Message message, byte[] bytes) {
  5. // 收到消息的处理逻辑
  6. log.info("Receive message : " + message);
  7. }
  8. }, CHANNEL.getBytes(StandardCharsets.UTF_8));

相关资料