本文共 5115 字,大约阅读时间需要 17 分钟。
操作redis有2种常见方式
redis.clients jedis 3.3.0
// 重载方法很多,可指定超时时间、是否使用ssl等Jedis jedis=new Jedis("192.168.1.9", 6379);// jedis.auth("xxxx"); //如果需要密码// jedis.select(0); //选择要使用的数据库if (jedis.ping().equals("PONG")){ //连接成功 jedis.zadd("users", 1223, "zhangsan"); jedis.zadd("users", 2568, "lisi"); jedis.zadd("users", 1379, "wangwu"); //迭代 Setusers = jedis.zrangeWithScores("users", 0, -1); //[0,-1] for (Tuple user:users){ String name = user.getElement(); //获取元素值 double score = user.getScore(); //获取分数 System.out.println(name+"的积分是:"+score); }}else{ System.out.println("无法连接redis服务器");}jedis.close();
// jedis连接池配置JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxTotal(15);jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMinIdle(5);jedisPoolConfig.setMaxWaitMillis(180);//若一个Jedis对象闲置多少秒,就销毁// 重载方法很多,可指定超时时间、是否使用ssl、密码等JedisPool jedisPool= new JedisPool(jedisPoolConfig, "192.168.1.9", 6379);Jedis jedis = jedisPool.getResource();
// 集群节点Setnodes = new HashSet();nodes.add(new HostAndPort("192.168.1.1", 6379));nodes.add(new HostAndPort("192.168.1.2", 6379));nodes.add(new HostAndPort("192.168.1.3", 6379));nodes.add(new HostAndPort("192.168.1.4", 6379));nodes.add(new HostAndPort("192.168.1.5", 6379));nodes.add(new HostAndPort("192.168.1.6", 6379));// 获取JedisCluster对象,通过JedisCluster对象来操作JedisCluster jedisCluster = new JedisCluster(nodes);String user = jedisCluster.get("user");jedisCluster.close();
创建时勾线redis
或者手动添加依赖org.springframework.boot spring-boot-starter-data-redis
spring: redis: #单机版redis配置,默认localhost、6379、0 host: 192.168.1.1 port: 6379 database: 0 #连接到redis服务器的超时时间,ms timeout: 3000 #如果是redis集群,则使用以下配置# cluster:# nodes: 192.168.1.1:6379,192.168.1.2:6379,192.168.1.3:6379 #jedis连接池配置 jedis: pool: #默认8,-1表示不限制 max-active: 200 #默认0 min-idle: 50 #默认8 max-idle: 100 #如果jedis连接池没有闲置连接可用,最多等待多少ms max-wait: 3000
直接使用RedisTemplate提供的方法,一句代码要写很长,可以自己封装一下,使用时注入RedisUtil;也可以不封装,直接使用RedisTemplate。
@Componentpublic class RedisUtil { @Autowired private static StringRedisTemplate redisTemplate; public static void set(String key,String value){ redisTemplate.opsForValue().set(key,value); } public static String get(String key){ return redisTemplate.opsForValue().get(key); } public static void hset(String key,String field,Object value { redisTemplate.opsForHash().put(key,field,value); } public static Object hget(String key,String field){ return redisTemplate.opsForHash().get(key,field); } //......}
setnx() 设置key
在任务执行过程中,如果发生异常,不能继续往下执行,也应该马上释放锁。任务完成后用del()删除key或者用expire()将有效期置为0,释放锁。
上面的方式存在问题:分为setnx()、expire()2步,原子性得不到满足,可能出现并发问题。
更好的方式:使用redis命令的原子性#ex指定过期时间(s),px也是指定过期时间(ms),nx是key不存在时才执行set(即新建),xx表示key已存在时才执行set(即更新)set lock "xxxxxxx" ex 60 nx// jedisjedis.set("lock", "xxxxxx", SetParams.setParams().ex(120).nx());
值一般设置为线程号
对应的方法如下
// 设置key,absent,缺席、不存在,返回布尔值Boolean redisTemplate.opsForValue().setIfAbsent(key,value) // 设置有效期,key、数值、单位redisTemplate.expire(key,2,TimeUnit.MINUTES)// 更好的写法,原子性Boolean redisTemplate.opsForValue().setIfAbsent(key,value,2,TimeUnit.MINUTES) // 删除keyredisTemplate.delete(key)
pipeline 管道、流水线。
如果客户端短时间内需要执行多个redis命令,且后面的命令不依赖前面命令的执行结果,则可以使用pipeline打包发送,以减少网络通信的时间开销,解决频繁的命令往返造成的性能瓶颈。
@Autowiredprivate StringRedisTemplate redisTemplate;public void test() { //... //返回值list,元素对应各条命令的执行结果 List
转载地址:http://bzhlb.baihongyu.com/