
文章插图
- rightPop(K key),从 List 右侧取出第一个元素,并移除,如从数组尾部获取并移除值:
@Test public void testRightPop() {Object rightFirstElement = redisTemplate.opsForList().rightPop("TestList");System.out.println(rightFirstElement); }操作 HashRedis 中的 Hash 数据结构实际上与 Java 中的 HashMap 是非常类似的,提供的 API
也很类似 。下面我们就一起来看下 RedisTemplate 为 Hash 提供了哪些 API 。
- Hash 中新增元素 。
@Testpublic void testPut() {redisTemplate.opsForHash().put("TestHash", "FirstElement", "Hello,Redis hash.");Assert.assertTrue(redisTemplate.opsForHash().hasKey("TestHash", "FirstElement"));}- 判断指定 key 对应的 Hash 中是否存在指定的 map
键,使用用法可以见上方代码所示 。 - 获取指定 key 对应的 Hash 中指定键的值 。
@Testpublic void testGet() {Object element = redisTemplate.opsForHash().get("TestHash", "FirstElement");Assert.assertEquals("Hello,Redis hash.", element);}- 删除指定 key 对应 Hash 中指定键的键值对 。
@Testpublic void testDel() {redisTemplate.opsForHash().delete("TestHash", "FirstElement");Assert.assertFalse(redisTemplate.opsForHash().hasKey("TestHash", "FirstElement"));}操作集合集合很类似于 Java 中的 Set,RedisTemplate 也为其提供了丰富的 API 。
- 向集合中添加元素 。
@Testpublic void testAdd() {redisTemplate.opsForSet().add("TestSet", "e1", "e2", "e3");long size = redisTemplate.opsForSet().size("TestSet");Assert.assertEquals(3L, size);}- 获取集合中的元素 。
@Testpublic void testGet() {Set<String> testSet = redisTemplate.opsForSet().members("TestSet");System.out.println(testSet);}执行上面的代码后,控制台输出的是 [e1, e3,e2],当然您可能会看到其他结果,因为 Set是无序的,并不是按照我们添加的顺序来排序的 。- 获取集合的长度,在像集合中添加元素的示例代码中展示了如何获取集合长度 。
- 移除集合中的元素 。’
@Testpublic void testRemove() {redisTemplate.opsForSet().remove("TestSet", "e1", "e2");Set testSet = redisTemplate.opsForSet().members("TestSet");Assert.assertEquals("e3", testSet.toArray()[0]);}操作有序集合与 Set 不一样的地方是,ZSet 对于集合中的每个元素都维护了一个权重值,那么
RedisTemplate 提供了不少与这个权重值相关的 API 。
API描述add(K key, V value, double score)添加元素到变量中同时指定元素的分值 。range(K key, long start, long end)获取变量指定区间的元素 。rangeByLex(K key, RedisZSetCommands.Range range)用于获取满足非 score 的排序取值 。这个排序只有在有相同分数的情况下才能使用,如果有不同的分数则返回值不确定 。angeByLex(K key, RedisZSetCommands.Range range, RedisZSetCommands.Limit limit)用于获取满足非 score 的设置下标开始的长度排序取值 。add(K key, Set<ZSetOperations.TypedTuple<V>> tuples)通过 TypedTuple 方式新增数据 。rangeByScore(K key, double min, double max)根据设置的 score 获取区间值 。rangeByScore(K key, double min, double max,long offset, long count)根据设置的 score 获取区间值从给定下标和给定长度获取最终值 。rangeWithScores(K key, long start, long end)获取 RedisZSetCommands.Tuples 的区间值 。
实现分布式锁
上面基本列出了 RedisTemplate 和 StringRedisTemplate 两个类所提供的对 Redis
操作的相关 API,但是有些时候这些 API
并不能完成我们所有的需求,这个时候我们其实还可以在 Spring Boot 项目中直接与
Redis
交互来完成操作 。比如,我们在实现分布式锁的时候其实就是使用了 RedisTemplate 的 execute 方法来执行
lua 脚本来获取和释放锁的 。
清单 4. 获取锁
Boolean lockStat = stringRedisTemplate.execute((RedisCallback<Boolean>)connection ->connection.set(key.getBytes(Charset.forName("UTF-8")), value.getBytes(Charset.forName("UTF-8")),Expiration.from(timeout, timeUnit), RedisStringCommands.SetOption.SET_IF_ABSENT));清单 5. 释放锁String script = “if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) elsereturn 0 end”; boolean unLockStat =stringRedisTemplate.execute((RedisCallback<Boolean>)connection -> connection.eval(script.getBytes(), ReturnType.BOOLEAN, 1, key.getBytes(Charset.forName(“UTF-8”)), value.getBytes(Charset.forName(“UTF-8”))));
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 续航不够省电来凑,手机省电最全攻略
- 图解Raft:应该是最容易理解的分布式一致性算法
- 中乙|中乙球员月薪一万是高薪?这不应该是很正常的事情吗?
- 绿茶冲泡最全攻略,全麦绿茶馒头的做法
- 步行健身的最好方式是什么 步行健身的正确方式应该是什么
- 柴犬的价格应该是估计 柴犬价格为什么这么贵
- 白茶收藏需注意的问题,冲泡白茶的水温应该是多少
- 狗狗正常体温应该是多少 狗狗多少体温属于正常
- 湖南|在职场中,哪些心态应该是必备的?
- 全网最全的IDEA热部署方案,看完弄懂,再也不用加班
