- 缓存
- 分布式锁
- 计数器
- 打卡
-
key名设计
ugc:video:1
使用连接池
Jedis jedis = null;try {jedis = jedisPool.getResource();//具体的命令jedis.executeCommand()} catch (Exception e) {logger.error("op key {} error: " + e.getMessage(), key, e);} finally {//注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。if (jedis != null)jedis.close();}
Redis 客户端
Java: Jedis, Lettuce, Redisson
- C/C++: hiredis, redis-plus-plus
- Python: redis-py
- Go: Redigo
Redis 分布式锁
public boolean setnx(String key, String val) {Jedis jedis = null;try {jedis = jedisPool.getResource();if (jedis == null) {return false;}return jedis.set(key, val, "NX", "PX", 1000 * 60).equalsIgnoreCase("ok");} catch (Exception ex) {} finally {if (jedis != null) {jedis.close();}}return false;}
public int delnx(String key, String val) {Jedis jedis = null;try {jedis = jedisPool.getResource();if (jedis == null) {return 0;}//if redis.call('get','orderkey')=='1111' then return redis.call('del','orderkey') else return 0 endStringBuilder sbScript = new StringBuilder();sbScript.append("if redis.call('get','").append(key).append("')").append("=='").append(val).append("'").append(" then ").append(" return redis.call('del','").append(key).append("')").append(" else ").append(" return 0").append(" end");return Integer.valueOf(jedis.eval(sbScript.toString()).toString());} catch (Exception ex) {} finally {if (jedis != null) {jedis.close();}}return 0;}
发布订阅
private static String CHANNEL = "didispace";private RedisTemplate<String, String> redisTemplate;redisTemplate.convertAndSend(CHANNEL, message);
RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection();redisConnection.subscribe(new MessageListener() {@Overridepublic void onMessage(Message message, byte[] bytes) {// 收到消息的处理逻辑log.info("Receive message : " + message);}}, CHANNEL.getBytes(StandardCharsets.UTF_8));
