首页 > 编程知识 正文

微服务中使用redis

时间:2023-05-05 00:03:23 阅读:189454 作者:4254

微服务器使用redis 1.微服务器集成redis2.配置3.string4. has H5.list6. set7. sorted set

1 .微服务集成redis

spring: # 配置redis服务器redis : host :10.0.228.117 port :6379 password : ' ' time out :60000数据库3360连接池属性设置lettuse 最小空闲连接数最小- idle :5#最大空闲连接数max-idle: 10 #最大活动连接数max-active: 10 #最大连接数max-wait33603000SPP spring boot 2.x

因为Lettuce和Jedis都是Redis的客户端,所以他们可以连接到Redis服务器。

Jedis是安装上直接连接的Redis Server,在多线程环境下是非线程安全的。

每个线程都去获取自己的Jedis实例,随着连接数的增加,资源消耗会逐步增加,连接成本也会提高。

Lettuce的连接基于Netty,Netty是一个多线程、事件驱动的I/O框架。 连接实例可以在多个线程之间共享,并且如果多线程使用同一连接实例,则连接实例是线程安全的。

因此,多线程APP应用程序可以使用同一个连接实例,而不需要考虑并发线程的数量。

当然,这也是一种可伸缩的设计,即使缺少一个连接实例,也可以根据需要增加连接实例。

异步方法可以更好地利用系统资源,而不会浪费线程等待网络或磁盘I/O。

Lettuce有助于充分利用异步的好处。

在spring boot 2.x上。 即使在application.yaml中配置了spring.redis.jedis.pool .实际使用的也是letturce。

如果必须切换,则需要在starter上进行处理。

它配置了连接池和服务器属性,Spring Boot自动汇编机制读取这些配置并生成Redis的操作对象。 自动生成常见的Redis操作对象,如RedisConnectionFactory、RedisTemplate和StringRedisTemplate。 缺省情况下,redis模板使用jdkserializationredisserializer序列化并存储在redis中。 如果需要在Redis中存储字符串,则可以使用Spring Boot自动生成的StringRedisTemplate。

@ testpublicvoidteststringredistemplate ((stringredistemplate.ops for value ).set('string-redis-template ',)

但是,StringRedisTemplate只存储字符串,而不存储对象。

要解决此问题,可以通过配置RedisTemplate串行化器来解决。

首先注释掉原始配置中的redisTemplate

然后在APP中追加初始化方法

验证

3.string @ springboottestpublicclassstringredistests { @ autowiredprivateredistemplateredistemplate; @Test public void testRedis () { redisTemplate.opsForValue ) ).set('int_key ','1' ); system.out.println (redis template.ops for value ().get ) ' int_key ' ); redisTemplate.opsForValue ().increment ) ' int_key ',1 ); system.out.println (redis template.ops for value ().get ) ' int_key ' ); redisTemplate.opsForValue ().increment ) ' int_key ',-1); system.out.println (redis template.ops for value ().get ) ' int_key ' ); }

4.hash @ springboottestpublicclasshashredistests { @ autow }

ired private RedisTemplate redisTemplate; @Test public void testHashRedis(){ Map<String, String> map = new LinkedHashMap<>(); map.put("keys1", "keys1"); map.put("keys2", "keys2"); redisTemplate.opsForHash().putAll("hashredis", map); System.out.println(redisTemplate.opsForHash().get("hashredis", "keys1")); System.out.println(redisTemplate.opsForHash().get("hashredis", "keys2")); }}

5. List @SpringBootTestpublic class ListRedisTests { @Autowired private RedisTemplate redisTemplate; @Test public void testListRedis() { redisTemplate.opsForList().leftPushAll("left", "l1", "l2", "l3", "l4", "l5"); redisTemplate.opsForList().rightPushAll("right", "r1", "r2", "r3", "r4", "r5"); System.out.println(redisTemplate.opsForList().leftPop("left")); System.out.println(redisTemplate.opsForList().rightPop("right")); System.out.println("index" + redisTemplate.opsForList().index("left", 3L)); System.out.println("size of right" + redisTemplate.opsForList().size("right")); List list = redisTemplate.opsForList().range("left", 0, -1); System.out.println(list); }}

6. Set @SpringBootTestpublic class SetRedisTests { @Autowired private RedisTemplate redisTemplate; @Test public void testSetRedis() { redisTemplate.opsForSet().add("set1", "s1", "s2", "s3", "s4", "s5"); redisTemplate.opsForSet().add("set2", "s4", "s5", "s6", "s7", "s8", "s9"); redisTemplate.opsForSet().add("set1", "tt"); redisTemplate.opsForSet().remove("set1", "tt"); System.out.println(redisTemplate.opsForSet().members("set1")); System.out.println(redisTemplate.opsForSet().members("set2")); System.out.println(redisTemplate.opsForSet().size("set1")); System.out.println(redisTemplate.opsForSet().size("set2")); // 交集 System.out.println("交集"); Set inte = redisTemplate.opsForSet().intersect("set1", "set2"); System.out.println(inte); redisTemplate.opsForSet().intersectAndStore("set1", "set2", "setand"); System.out.println(redisTemplate.opsForSet().members("setand")); // 差集 // set1 - set2 System.out.println("set1 - set2"); Set diff = redisTemplate.opsForSet().difference("set1", "set2"); System.out.println(diff); System.out.println("set2 - set1"); System.out.println(redisTemplate.opsForSet().difference("set2", "set1")); redisTemplate.opsForSet().differenceAndStore("set1", "set2", "setxx1"); System.out.println(redisTemplate.opsForSet().members("setxx1")); redisTemplate.opsForSet().differenceAndStore("set2", "set1", "setxx2"); System.out.println(redisTemplate.opsForSet().members("setxx2")); // 并集 System.out.println("并集"); Set union = redisTemplate.opsForSet().union("set1", "set2"); redisTemplate.opsForSet().unionAndStore("set1", "set2", "setmm"); System.out.println(redisTemplate.opsForSet().members("setmm")); }}

7. Sorted Set

有序集合比集合多个分数scope的属性,因此,spring提供了TypedTuple接口用于存储。

@SpringBootTestpublic class SortedSetRedisTests { @Autowired private RedisTemplate redisTemplate; public void testSortedSet() { int sum = 1000; var dataSet = new HashSet<ZSetOperations.TypedTuple<String>>(sum); for(int i = 0;i < sum; i++) { dataSet.add(new DefaultTypedTuple<>("value"+i, i/1000.0)); } redisTemplate.opsForZSet().add("zset", dataSet); System.out.println("size = " + redisTemplate.opsForZSet().size("zset")); redisTemplate.opsForZSet().add("zset", "test", 1.0); System.out.println(redisTemplate.opsForZSet().range("zset", -1, -10)); System.out.println(redisTemplate.opsForZSet().rangeByScore("zset", 0.966, 1.000)); System.out.println(redisTemplate.opsForZSet().score("zset", "test")); redisTemplate.opsForZSet().remove("zset", "test"); System.out.println(redisTemplate.opsForZSet().rangeWithScores("zset", 0, 10)); System.out.println(redisTemplate.opsForZSet().reverseRange("zset", 0, 10)); System.out.println(redisTemplate.opsForZSet().reverseRangeWithScores("zset", 0, 10)); }}


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。