纯粹的redis命令行操作,可能就跟纯粹的mysql命令行操作一样,会有一种就是为了用而用的感觉。所以一般来说redis作为一个缓存中间件,都会辅以其他的客户端语言进行操作,比如java。
redis是开源的,java也是开源的,这就注定了java中连接redis的客户端不止一种,常见的有jedis、redisson、lettuce。
在如今一切都在高速运行的社会环境下,java软件开发也是极其追求代码产出效率,所以随处可见的都是springcloud、springboot。
springboot约定优于配置的思想,一定程度上也确实大大简化了开发工作,所以在学习java中的redis集成和使用时,我也一样选择了使用springboot。
springboot集成redis
springboot中集成redis,和springboot集成其他一些组件类似,基本都是引入一个starter即可:
1 | <dependency> |
数据源连接配置
有了依赖的引入后,接下来就是配置redis,springboot中如果是使用yml格式,则基础配置如下:
1 | spring: |
以上host指向Redis服务器的ip,这里是我自己虚拟机的ip,没有设置密码,所以密码没有。
redis默认有16个database,可以在配置文件中修改,我没有修改,还是使用默认的16个,而这里客户端连接使用0号database。同样的,端口号使用默认6379.
restTemplate使用
springboot中对redis的大多数操作都进行了统一的封装,即RedisTemplate,对于之前说到的redis的五种基本数据类型以及一些常用高级功能的操作,都是通过RedisTemplate进行。
redisTemplate.opsForValue()可以获取一个对string类型的操作;
redisTemplate.opsForList()可以获取一个对list类型的操作;
redisTemplate.opsForHash()可以获取一个对hash类型的操作;
redisTemplate.opsForSet()可以获取一个对set类型的操作;
redisTemplate.opsForZSet()可以获取一个对sorted_set类型的操作
基于上边的内容,就可以演示5种类型对数据的基本存储操作,例如:
1 | redisTemplate.opsForValue().set(key,value); |
在基础数据类型中说道,string里边其实还要很多类型,比如bitmap,目前我使用的springboot-redis版本似乎还不完全支持bitmap的所有操作,例如保存bitmap有现成的封装,可以写成下边这样:
1 | redisTemplate.opsForValue().setBit(key,0,true); |
但是像bitmap的统计bitcount就没有直接操作的方法,需要自己写回调函数进行操作:
1 | redisTemplate.execute((RedisCallback<Long>)connection -> connection.bitCount((key).getBytes())); |
除了基础数据类型的简单操作,redisTemplte也可以进行过期设置,以及管道等高级功能的操作,例如;
1 | redisTemplate.expire("k111",200, TimeUnit.SECONDS); |
过期操作其实也很简单,和其他一些操作一样,都和命令行操作极其相似,基本上点一下api提示就可以看懂用法,管道操作就相对复杂一点,也是需要自己实现一定的回调函数进行处理,但是实际也比较简单。
连接池简单配置
实际使用redis的时候,都不会是上边那样仅仅配置ip和端口等就行了,而是还会加上其他的配置,例如连接池。
上边说java中连接redis常用的客户端有三种,springboot默认使用的就是lettuce,所以默认连接池的配置也是使用lettuce,加上连接池的几个简单配置后,redis配置如下:
1 | spring: |
这里需要注意的是,lettuce连接池虽然可以配置,但是实际上还缺少依赖,如果就这样启动,会发现启动会报错:
1 | Caused by: java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig |
上边错误提示其实很明显了,就是缺少commons-pool2相关的类,所以这里就需要再引入相关依赖;
1 | <dependency> |
有了上边依赖之后,再次启动,便可以正常使用了。
key显示不正常问题
上边的操作看起来没什么,但其实会有一个问题,如果取一下数据就会发现数据的key并不是我们存进去的内容,会有一部分像是乱码一样。
解决办法之一是使用springboot封装的高阶API,即StringRedisTemplate,另一个办法就是配置redis序列化,例如:
1 | @Autowired(required = false) |
相关文章
缓存和redis相关基础知识
Linux中redis安装及软件安装相关Linux知识要点
redis数据类型要点知识及应用场景
redis管道、事务、发布订阅、过期、过滤器等常用高级功能小记(上篇)
redis管道、事务、发布订阅、过期、过滤器等常用高级功能小记(下篇)
springboot集成和使用redis常用功能