spring boot 整合 redis

骑猪看日落 2022-04-08 09:56 336阅读 0赞

使用spring 2.0 以上

注:该案例没有设置某一个key具体的设置有效的时间,如有知道的,请下方留言(感激不尽)

实体类的配置:

  1. package com.example.redis.redis.entity;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. public class UserInfo implements Serializable {
  5. private Integer uid;
  6. private String username;//帐号
  7. private String name;//名称(昵称或者真实姓名,不同系统不同定义)
  8. private String password; //密码;
  9. private String salt;//加密密码的盐
  10. private byte state;//用户状态,0:创建未认证(比如没有激活,没有输入验证码等等)--等待验证的用户 , 1:正常状态,2:用户被锁定.
  11. private List<SysRole> roleList;// 一个用户具有多个角色
  12. public Integer getUid() {
  13. return uid;
  14. }
  15. public void setUid(Integer uid) {
  16. this.uid = uid;
  17. }
  18. public String getUsername() {
  19. return username;
  20. }
  21. public void setUsername(String username) {
  22. this.username = username;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. public String getPassword() {
  31. return password;
  32. }
  33. public void setPassword(String password) {
  34. this.password = password;
  35. }
  36. public String getSalt() {
  37. return salt;
  38. }
  39. public void setSalt(String salt) {
  40. this.salt = salt;
  41. }
  42. public byte getState() {
  43. return state;
  44. }
  45. public void setState(byte state) {
  46. this.state = state;
  47. }
  48. public List<SysRole> getRoleList() {
  49. return roleList;
  50. }
  51. public void setRoleList(List<SysRole> roleList) {
  52. this.roleList = roleList;
  53. }
  54. /**
  55. * 密码盐.
  56. *
  57. * @return
  58. */
  59. public String getCredentialsSalt() {
  60. return this.username + this.salt;
  61. }
  62. //重新对盐重新进行了定义,用户名+salt,这样就更加不容易被破解
  63. @Override
  64. public String toString() {
  65. return "UserInfo{" +
  66. "uid=" + uid +
  67. ", username='" + username + '\'' +
  68. ", name='" + name + '\'' +
  69. ", password='" + password + '\'' +
  70. ", salt='" + salt + '\'' +
  71. ", state=" + state +
  72. ", roleList=" + roleList +
  73. '}';
  74. }
  75. }

redisConfing的配置

  1. package com.example.redis.redis.config;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.cache.annotation.Cacheable;
  4. import org.springframework.cache.annotation.CachingConfigurerSupport;
  5. import org.springframework.cache.annotation.EnableCaching;
  6. import org.springframework.cache.interceptor.KeyGenerator;
  7. import org.springframework.context.annotation.Bean;
  8. import org.springframework.context.annotation.Configuration;
  9. import java.lang.reflect.Method;
  10. import java.util.Arrays;
  11. import java.util.stream.Collectors;
  12. @Configuration
  13. @EnableCaching
  14. @Cacheable()
  15. public class redisConfig extends CachingConfigurerSupport {
  16. @Value("${spring.redis.host}")
  17. private String host;
  18. @Value("${spring.redis.port}")
  19. private int port;
  20. @Value("${spring.redis.timeout}")
  21. private int timeout;
  22. //
  23. // /**
  24. // * 用于生成主键的策略
  25. // *
  26. // * @return
  27. // */
  28. @Bean
  29. public KeyGenerator wiselyKeyGenerator() {
  30. return new KeyGenerator() {
  31. @Override
  32. public Object generate(Object target, Method method, Object... params) {
  33. StringBuilder sb = new StringBuilder();
  34. sb.append(target.getClass().getName());
  35. sb.append("." + method.getName());
  36. if (params == null || params.length == 0 || params[0] == null) {
  37. return null;
  38. }
  39. String join = String.join("&", Arrays.stream(params).map(Object::toString).collect(Collectors.toList()));
  40. String format = String.format("%s{%s}", sb.toString(), join);
  41. //log.info("缓存key:" + format);
  42. return "a2";
  43. }
  44. };
  45. }
  46. }

controller

  1. package com.example.redis.redis.controller;
  2. import com.example.redis.redis.userServer.UserInfo;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Component;
  5. import org.springframework.stereotype.Controller;
  6. import java.util.HashMap;
  7. import java.util.Map;
  8. @Component
  9. public class controller {
  10. @Autowired
  11. private UserInfo userInfo;
  12. public void add() {
  13. com.example.redis.redis.entity.UserInfo admin = userInfo.findByUsername("admin");
  14. }
  15. public void update(){
  16. Map<Object, Object> map = new HashMap<>();
  17. map.put("admin","admin");
  18. map.put("name","管理员1");
  19. userInfo.updateByusername(map);
  20. }
  21. }

Mapper

  1. package com.example.redis.redis.Dao;
  2. import com.example.redis.redis.entity.UserInfo;
  3. import org.apache.ibatis.annotations.Param;
  4. import org.springframework.cache.annotation.CacheConfig;
  5. import org.springframework.cache.annotation.Cacheable;
  6. import org.springframework.stereotype.Component;
  7. import java.util.Map;
  8. @org.apache.ibatis.annotations.Mapper
  9. @Component
  10. // 表示该类中可能有多个缓存,有些缓存可能是一致的
  11. public interface Mapper {
  12. UserInfo findByUsername(@Param("username") String username);
  13. void updateByusername( Map map );
  14. }

serverimpl

  1. package com.example.redis.redis.userServer.impl;
  2. import com.example.redis.redis.Dao.Mapper;
  3. import com.example.redis.redis.entity.UserInfo;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
  6. import org.springframework.cache.annotation.CacheEvict;
  7. import org.springframework.cache.annotation.Cacheable;
  8. import org.springframework.stereotype.Service;
  9. import java.util.Map;
  10. @Service
  11. //@CacheConfig(cacheNames = "users")
  12. public class UserInfoImpl implements com.example.redis.redis.userServer.UserInfo {
  13. @Autowired
  14. private Mapper mapper;
  15. @Override
  16. @Cacheable(value = "all2", keyGenerator = "wiselyKeyGenerator")
  17. public UserInfo findByUsername(String name) {
  18. UserInfo mapperByUsername = mapper.findByUsername(name);
  19. System.out.println("数据库读取数据....");
  20. return mapperByUsername;
  21. }
  22. @Override
  23. @CacheEvict(value = "all2",allEntries = true) // 在使用删除的时候,需要全部清除,如果一条一条的清除,效率会很低
  24. public void updateByusername(Map map) {
  25. mapper.updateByusername(map);
  26. }
  27. }

service接口

  1. package com.example.redis.redis.userServer;
  2. import java.util.Map;
  3. public interface UserInfo {
  4. com.example.redis.redis.entity.UserInfo findByUsername(String admin);
  5. void updateByusername(Map map );
  6. }

Application

  1. package com.example.redis.redis;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cache.annotation.EnableCaching;
  5. @SpringBootApplication
  6. @EnableCaching // 启动缓存
  7. public class RedisApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(RedisApplication.class, args);
  10. }
  11. /**
  12. * 重新配置RedisCacheManager
  13. *
  14. * @param rd
  15. */
  16. }

Mapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.example.redis.redis.Dao.Mapper">
  4. <resultMap id="map" type="com.example.redis.redis.entity.UserInfo">
  5. <id property="uid" column="uid"></id>
  6. <result property="username" column="username"></result>
  7. <result property="name" column="name"></result>
  8. <result property="password" column="password"></result>
  9. <result property="salt" column="salt"></result>
  10. <result property="state" column="state"></result>
  11. <!--id,description,role,available-->
  12. <collection property="roleList" ofType="com.example.redis.redis.entity.SysRole">
  13. <id property="id" column="id"></id>
  14. <result property="role" column="role"></result>
  15. <result property="description" column="description"></result>
  16. <result property="available" column="available"></result>
  17. <!--id,name,resourceType,url,permission,parentId,parentIds,available-->
  18. <collection property="permissions" ofType="com.example.redis.redis.entity.SysPermission">
  19. <id property="id" column="id"></id>
  20. <result property="name" column="name"></result>
  21. <result property="resourceType" column="resourceType"></result>
  22. <result property="url" column="url"></result>
  23. <result property="permission" column="permission"></result>
  24. <result property="parentId" column="parentId"></result>
  25. <result property="parentIds" column="parentIds"></result>
  26. <result property="available" column="available"></result>
  27. </collection>
  28. </collection>
  29. </resultMap>
  30. <select id="findByUsername" parameterType="java.lang.String" resultMap="map">
  31. SELECT *
  32. FROM user_info
  33. INNER JOIN sys_user_role ON user_info.uid = sys_user_role.uid
  34. INNER JOIN sys_role ON role_id = sys_role.id
  35. INNER JOIN sys_role_permission ON sys_role.id = sys_role_permission.role_id
  36. INNER JOIN sys_permission ON permissionid = sys_role_permission.id
  37. <where>
  38. <if test="username != null and username !=''">
  39. username = #{username} group by username
  40. </if>
  41. </where>
  42. </select>
  43. <!--<select id="findByUsername" parameterType="java.lang.String" resultType="com.sgqing.demo.entity.UserInfo">-->
  44. <!--SELECT *-->
  45. <!--FROM user_info-->
  46. <!--WHERE username = #{username}-->
  47. <!--</select>-->
  48. <update id="updateByusername" parameterType="java.util.Map">
  49. UPDATE user_info ui
  50. SET ui.name = #{name}
  51. WHERE ui.username = #{admin}
  52. </update>
  53. </mapper>

application.yml

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC
  4. username: root
  5. password: root
  6. driver-class-name: com.mysql.jdbc.Driver
  7. redis:
  8. database: 0
  9. host: 127.0.0.1
  10. port: 6379
  11. password:
  12. jedis:
  13. pool:
  14. max-active: 8
  15. max-wait: -1
  16. min-idle: 0
  17. max-idle: 8
  18. timeout: 1000
  19. jpa:
  20. show-sql: true
  21. server:
  22. port: 8081
  23. mybatis:
  24. typeAliasesPackage: com.example.redis.redis.Dao
  25. mapperLocations: classpath:mapper/*.xml

Test 测试

  1. package com.example.redis.redis.controller;
  2. import com.example.redis.redis.userServer.UserInfo;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import org.springframework.data.redis.core.RedisTemplate;
  8. import org.springframework.data.redis.core.StringRedisTemplate;
  9. import org.springframework.data.redis.core.ValueOperations;
  10. import org.springframework.test.context.junit4.SpringRunner;
  11. import javax.annotation.Resource;
  12. import java.util.HashMap;
  13. import java.util.Map;
  14. @RunWith(SpringRunner.class)
  15. @SpringBootTest
  16. public class controllerTest {
  17. @Autowired
  18. private UserInfo userInfo;
  19. // @Autowired
  20. // StringRedisTemplate stringRedisTemplate;
  21. // @Resource(name = "stringRedisTemplate")
  22. // ValueOperations<String, String> valOpsStr;
  23. // @Autowired
  24. // RedisTemplate<Object, Object> redisTemplate;
  25. //
  26. // @Resource(name = "redisTemplate")
  27. // ValueOperations<Object, Object> valOps;
  28. @Test
  29. public void test() {
  30. com.example.redis.redis.entity.UserInfo admin = userInfo.findByUsername("admin");
  31. System.out.println(admin);
  32. }
  33. @Test
  34. public void test2() {
  35. Map<String, String> map = new HashMap<>();
  36. map.put("name", "管理员5");
  37. map.put("admin", "admin");
  38. userInfo.updateByusername(map);
  39. }
  40. }

如果不设置key的生成策略,可以只在application中开启缓存即可使用缓存的注解

效果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODI5Nzg3OQ_size_16_color_FFFFFF_t_70

参考网址

https://blog.csdn.net/hry2015/article/details/75451705

用于设置不同的数据不同的缓存时间

  1. @Cacheable(value = "people#${select.cache.timeout:1800}#${select.cache.refresh:600}", key = "#person.id", sync = true)

value属性上用#号隔开,第一个是原始的缓存容器名称,第二个是缓存的有效时间,第三个是缓存的自动刷新时间,单位都是秒

时间的设置如果存储在数据库中,可以首先将数据读取出来,用@ModelAttribute 注解,该注解会在当前类的所有的方法被调用之前执行,所以在请求方法很多的时候,该方法需要慎用,如果想要在所有的类,不只局限于当前类的所有的请求方法之前添加

  1. @ModelAttribute 注解的方法,则需要在当前类上面添加@ControllerAdvice 参考网址https://www.cnblogs.com/magicalSam/p/7198420.html

2019-1-31

了解到,如果要单独设置每个属性的单独的时间,可以参考该网址

https://segmentfault.com/q/1010000015203664/a-1020000015209787

发表评论

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

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

相关阅读