清单 3. RedisTemplate 和 StringRedisTemplate 的配置
@Configurationpublic class RedisConfig {@Bean@ConditionalOnMissingBean(name = "redisTemplate")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(jackson2JsonRedisSerializer);template.setValueSerializer(jackson2JsonRedisSerializer);template.setHashKeySerializer(jackson2JsonRedisSerializer);template.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}@Bean@ConditionalOnMissingBean(StringRedisTemplate.class)public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {StringRedisTemplate template = new StringRedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}}操作字符串
StringRedisTempalte 在上面已经初始化好了,我们只需要在需要用到的地方通过 @AutoWired 注解注入就行 。
- 设置值,对于设置值,我们可以使用 opsForValue().void set(K var1, V var2);
@Testpublic void testSet() {stringRedisTemplate.opsForValue().set("test-string-value", "Hello Redis");}- 获取值,与 set 方法相对于 StringRedisTemplate 还提供了.opsForValue().get(Object
var1) 方法来获取指定 key 对应的 value 值 。
@Testpublic void testGet() {String value = https://www.isolves.com/it/sjk/Redis/2021-01-13/stringRedisTemplate.opsForValue().get("test-string-value");System.out.println(value);}- 设置值的时候设置过期时间 。在设置缓存的时候,我们通常都会给他设置一个过期时间,让其能够达到定时刷新的效果 。StringRedisTemplate 提供了 void
set(K var1, V var2, long var3, TimeUnitvar5) 方法来达到设置过期时间的目的,其中 var3 这个参数就是过期时间的数值,而 TimeUnit 是个枚举类型,我们用它来设置过期时间的单位,是小时或是秒等等 。
@Testpublic void testSetTimeOut() {stringRedisTemplate.opsForValue().set("test-string-key-time-out", "Hello Redis", 3, TimeUnit.HOURS);}- 删除数据,我们同样可以通过 StringRedisTmeplate 来删除数据,Boolean delete(K
key)方法提供了这个功能 。
@Testpublic void testDeleted() {stringRedisTemplate.delete("test-string-value");}操作数组在 Redis 数据类型小节中,我们提到过我们经常使用 Redis
的 lpush/rpush/lpop/rpop 四条指令来实现一个队列 。那么这四条指令在 RedisTemplate 中也有相应的实现 。
- leftPush(K key, V value),往 List 左侧插入一个元素,如 从左边往数组中 push
元素:
@Test public void testLeftPush() {redisTemplate.opsForList().leftPush("TestList", "TestLeftPush"); }- rightPush(K key, V value),往 List 右侧插入一个元素,如从右边往数组中 push
元素:
@Testpublic void testRightPush() {redisTemplate.opsForList().rightPush("TestList", "TestRightPush");}- 执行完上面两个 Test 之后,我们可以使用 Redis 客户端工具 RedisDesktopManager
来查看 TestList 中的内容,如下图 (Push 之后 TestList 中的内容)所示:

文章插图
此时我们再一次执行 leftPush 方法,TestList 的内容就会变成下图(第二次执行leftPush 之后的内容)所示:

文章插图
可以看到 leftPush 实际上是往数组的头部新增一个元素,那么 rightPush就是往数组尾部插入一个元素 。
- leftPop(K key),从 List 左侧取出第一个元素,并移除,
如从数组头部获取并移除值:
@Testpublic void testLeftPop() {Object leftFirstElement = redisTemplate.opsForList().leftPop("TestList");System.out.println(leftFirstElement);}执行上面的代码之后,您会看到控制台会打印出 TestLeftPush,然后再去RedisDesktopManager 中查看 TestList 的内容,如下图(同数组顶端移除一个元素后)所示 。您会发现数组中的第一个元素已经被移除了 。
推荐阅读
- 续航不够省电来凑,手机省电最全攻略
- 图解Raft:应该是最容易理解的分布式一致性算法
- 中乙|中乙球员月薪一万是高薪?这不应该是很正常的事情吗?
- 绿茶冲泡最全攻略,全麦绿茶馒头的做法
- 步行健身的最好方式是什么 步行健身的正确方式应该是什么
- 柴犬的价格应该是估计 柴犬价格为什么这么贵
- 白茶收藏需注意的问题,冲泡白茶的水温应该是多少
- 狗狗正常体温应该是多少 狗狗多少体温属于正常
- 湖南|在职场中,哪些心态应该是必备的?
- 全网最全的IDEA热部署方案,看完弄懂,再也不用加班
