spring实战3 spring整合单例redis

小灰灰 2022-05-19 13:04 221阅读 0赞

前奏

工欲善其事必先利其器;预备一下工具对于整个环境的整合有极大的帮助

  1. linux环境中单例redis服务搭建,参考博客 centos7自学之7-redis-4.0.1单例服务器搭建
  2. redisDesktopManage redis可视化工具安装
  3. idea开发工具

开始

现如今,越来越多的公司注重用户对网站访问速度的体验。而缓存技术的出现无疑很好的适用以上场景。

因此掌握一门缓存技术对一名IT男无疑是必要的。

建项目

新建spring集成的web项目(spring-redis)-不用边看边做,后面会贴源码

添加配置文件

新建配置文件 redis.properties

  1. #访问地址
  2. redis.host=172.16.191.102
  3. # redis.host=192.168.1.106
  4. #访问端口
  5. redis.port=6379
  6. #授权密码,有没有这一项取决于要连接的redis服务是否设置了此项
  7. redis.auth=123456
  8. redis.dbIndex=0
  9. #连接池的最大数据库连接数。设为0表示无限制
  10. redis.maxIdle=1024
  11. #最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
  12. redis.maxActive=200
  13. #最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
  14. redis.maxWait=10000
  15. #在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
  16. redis.testOnBorrow=true

spring集成redis配置文件

  1. <context:property-placeholder location="classpath:properties/redis.properties" ignore-resource-not-found="true" />
  2. <!--<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:properties/redis.properties</value> </list> </property> </bean>-->
  3. <!-- redis config start -->
  4. <!-- 配置JedisPoolConfig实例 -->
  5. <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
  6. <property name="maxIdle" value="${redis.maxIdle}" />
  7. <property name="maxTotal" value="${redis.maxActive}" />
  8. <property name="maxWaitMillis" value="${redis.maxWait}" />
  9. <property name="testOnBorrow" value="${redis.testOnBorrow}" />
  10. </bean>
  11. <!-- 配置JedisConnectionFactory -->
  12. <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
  13. <property name="hostName" value="${redis.host}" />
  14. <property name="port" value="${redis.port}" />
  15. <property name="password" value="${redis.auth}" />
  16. <property name="database" value="${redis.dbIndex}" />
  17. <property name="poolConfig" ref="poolConfig" />
  18. </bean>
  19. <!-- 使用JDK提供的序列化功能。 优点是反序列化时不需要提供类型信息(class),但缺点是序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。 -->
  20. <bean id="stringKeySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
  21. <!-- JdkSerializationRedisSerializer,这个序列化方法是Idk提供的, 要求要被序列化的类继承自Serializeable接口,然后通过Jdk对象序列化的方法保存, 这个序列化保存的对象,即使是个String类型的,在redis控制台,也是看不出来的, 因为它保存了一些对象的类型什么的额外信息。 -->
  22. <bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
  23. <bean id="genericJackson2JsonRedisSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
  24. <!-- 使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍。 但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息。 -->
  25. <!--<bean id="jackson2JsonRedisSerializer" class="org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer"> <constructor-arg type="java.lang.Object" ></constructor-arg> </bean>-->
  26. <!-- 配置RedisTemplate -->
  27. <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
  28. <property name="connectionFactory" ref="jedisConnectionFactory" />
  29. <!-- 如果不配置Serializer,那么存储的时候只能使用String,如果用对象类型存储,那么会提示错误 can't cast to String!!!-->
  30. <property name="keySerializer" ref="stringKeySerializer"/>
  31. <property name="hashKeySerializer" ref="stringKeySerializer"/>
  32. <property name="valueSerializer" ref="genericJackson2JsonRedisSerializer"/>
  33. <property name="hashValueSerializer" ref="genericJackson2JsonRedisSerializer"/>
  34. </bean>
  35. <!-- 配置StringRedisTemplate 下面的各种key都是stringKeySerializer序列化方式-->
  36. <bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
  37. <property name="connectionFactory" ref="jedisConnectionFactory" />
  38. </bean>
  39. <!-- redis config end -->

redis增删改查

  1. @Repository(value = "redisRepository")
  2. public class RedisRepository extends AbstractSpringRedisCacheEnhance {
  3. @Autowired
  4. RedisTemplate<String, Object> redisTemplate;
  5. @Override
  6. public StringRedisTemplate getStringRedisTemplate() {
  7. return null;
  8. }
  9. @Override
  10. public RedisTemplate<String, Object> getRedisTemplate() {
  11. return redisTemplate;
  12. }
  13. }

此处增删改查写在了抽象类当中,具体代码上千行,有兴趣的可以访问我代码仓库查看(后面会附上仓库链接)

测试

编写测试类,测试增删改查api

  1. @RunWith(SpringRunner.class)
  2. @ContextConfiguration({
  3. "classpath*:/spring/applicationContext.xml"})
  4. public class RedisRepositoryTest {
  5. private Logger logger = LoggerFactory.getLogger(getClass());
  6. @Autowired private RedisRepository redisRepository;
  7. public Map<String, Object> generateMap(){
  8. Map<String, Object> returnMap = new HashMap<>();
  9. returnMap.put("aa", "aa");
  10. Map<String, Object> innerMap = new HashMap<>();
  11. innerMap.put("ss", 3);
  12. innerMap.put("rr",false);
  13. innerMap.put("tt","中文");
  14. returnMap.put("bb", innerMap);
  15. returnMap.put("cc", 1.000);
  16. returnMap.put("dd", true);
  17. returnMap.put("ee", 1);
  18. return returnMap;
  19. }
  20. public List<Map<String, Object>> generateList(){
  21. List<Map<String, Object>> list = new ArrayList<>();
  22. for (int i = 0; i < 10; i++) {
  23. list.add(generateMap());
  24. }
  25. return list;
  26. }
  27. @Test
  28. public void clear(){
  29. redisRepository.clear();
  30. }
  31. @Test
  32. public void testSet(){
  33. redisRepository.valueSet("name", "robot");
  34. redisRepository.valueSet("name2", "robot", 1600, TimeUnit.SECONDS);
  35. redisRepository.valueSet("set:map", generateMap());
  36. redisRepository.valueSet("set:map", generateMap(), 1600, TimeUnit.SECONDS);
  37. redisRepository.valueSet("set:list", generateList());
  38. redisRepository.valueSet("set:list", generateList(), 1600, TimeUnit.SECONDS);
  39. }
  40. @Test
  41. public void testGet(){
  42. logger.info("{}", redisRepository.valueGet("name", false));
  43. logger.info("{}", redisRepository.valueGet("name2", true));
  44. logger.info("{}", redisRepository.valueGet("set:map", false));
  45. logger.info("{}", redisRepository.valueGet("set:map", true));
  46. logger.info("{}", redisRepository.valueGet("set:list", false));
  47. logger.info("{}", redisRepository.valueGet("set:list", true));
  48. //logger.info("{}", redisRepository.getAndSet("name", "new value",false));
  49. //logger.info("{}", redisRepository.getAndSet("name", "new value",true));
  50. }
  51. @Test
  52. public void testIncrement(){
  53. for (int i = 0; i < 10; i++) {
  54. logger.info("{}", redisRepository.valueIncrement("mobile:15911111111", 1l, 60, TimeUnit.MINUTES));
  55. logger.info("{}", redisRepository.valueIncrement("tel:15911111111", 1.0, 70, TimeUnit.MINUTES));
  56. }
  57. }
  58. @Test
  59. public void testSetArray(){
  60. for (int i = 0; i < 10; i++) {
  61. logger.info("{}", redisRepository.setAdd("set:array1",i));
  62. }
  63. for (int i = 5; i < 20; i++) {
  64. logger.info("{}", redisRepository.setAdd("set:array1",i));
  65. logger.info("{}", redisRepository.setAdd("set:array2",i));
  66. }
  67. //logger.info("{}", redisRepository.setPop("set:array"));
  68. logger.info("{}", redisRepository.setDifference("set:array1","set:array2"));
  69. logger.info("{}", redisRepository.setDifferenceAndStore("set:array1","set:array2", "set:array3"));
  70. logger.info("{}", redisRepository.setAdd("set:add:map",generateMap()));
  71. logger.info("{}", redisRepository.setAdd("set:add:list",generateList()));
  72. logger.info("{}", redisRepository.setPop("set:add:map"));
  73. logger.info("{}", redisRepository.setPop("set:add:list"));
  74. }
  75. @Test
  76. public void testList(){
  77. for (int i = 0; i < 10; i++) {
  78. logger.info("{}", redisRepository.listLeftPush("list:lilo:list", generateList()));
  79. logger.info("{}", redisRepository.listLeftPush("list:liro:list", generateList()));
  80. logger.info("{}", redisRepository.listRightPush("list:rilo:list", generateList()));
  81. logger.info("{}", redisRepository.listRightPush("list:riro:list", generateList()));
  82. }
  83. for (int i = 0; i < 5; i++) {
  84. logger.info("{}", redisRepository.listLeftPop("list:lilo:list"));
  85. logger.info("{}", redisRepository.listRightPop("list:liro:list"));
  86. logger.info("{}", redisRepository.listLeftPop("list:rilo:list"));
  87. logger.info("{}", redisRepository.listRightPop("list:riro:list"));
  88. }
  89. for (int i = 0; i < 10; i++) {
  90. logger.info("{}", redisRepository.listLeftPush("list:lilo:map", generateMap()));
  91. logger.info("{}", redisRepository.listLeftPush("list:liro:map", generateMap()));
  92. logger.info("{}", redisRepository.listRightPush("list:rilo:map", generateMap()));
  93. logger.info("{}", redisRepository.listRightPush("list:riro:map", generateMap()));
  94. }
  95. for (int i = 0; i < 5; i++) {
  96. logger.info("{}", redisRepository.listLeftPop("list:lilo:map"));
  97. logger.info("{}", redisRepository.listRightPop("list:liro:map"));
  98. logger.info("{}", redisRepository.listLeftPop("list:rilo:map"));
  99. logger.info("{}", redisRepository.listRightPop("list:riro:map"));
  100. }
  101. }
  102. @Test
  103. public void testZSet(){
  104. for (int i = 0; i < 10; i++) {
  105. logger.info("{}", redisRepository.zSetAdd("zset:map", generateMap(), i));
  106. }
  107. redisRepository.zSetIncrementScore("zset:Map", "4", 30);
  108. }
  109. @Test
  110. public void testHash(){
  111. for (int i = 0; i < 10; i++) {
  112. redisRepository.hashPut("hash:map", String.valueOf(i), generateMap());
  113. logger.info("{}", redisRepository.hashGet("hash:map", String.valueOf(i)));
  114. }
  115. for (int i = 0; i < 10; i++) {
  116. redisRepository.hashPut("hash:list", String.valueOf(i), generateList());
  117. logger.info("{}", redisRepository.hashGet("hash:list", String.valueOf(i)));
  118. }
  119. }
  120. }

效果图

这里写图片描述

源码

spring-redis

发表评论

表情:
评论列表 (有 0 条评论,221人围观)

还没有评论,来说两句吧...

相关阅读

    相关 spring整合redis

    目录 pom文件加入依赖 新建spring-redis.properties文件,并在主spring.xml里引入 新建redis.properties文件,里面包含re