当前位置:   article > 正文

使用java代码来操作Redis_java 写redis缓存代码

java 写redis缓存代码

目录

1.jedis         

步骤一:导入对应的依赖

步骤二:测试

2.spring-date-redis 技术

步骤一:坐标

步骤二:application.properties中加入redis相关配置

步骤三:操作说明

注意:

1.两者数据各自存,各自取,数据不互通。         RedisTemplate不能取StringRedisTemplate存入的数据         StringRedisTemplate不能取RedisTemplate存入的数据

2.序列化策略不同:

步骤四:具体应用 

1.为了更好的使用,需要导入fastjson工具包

 专用字符串key value均是String

专用对象

自定义-基础版 

自定义-实际应用版

业务层优化:

序列化策略:

改变序列化策略

spring-data-redis提供如下几种序列化策略


1.jedis         

是Redis官方推荐的java连接开发工具

步骤一:导入对应的依赖

  1. <!--导入jedis的包-->
  2. <dependencies>
  3. <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
  4. <dependency>
  5. <groupId>redis.clients</groupId>
  6. <artifactId>jedis</artifactId>
  7. <version>3.2.0</version>
  8. </dependency>
  9. </dependencies>

步骤二:测试

直接连接:1.实例化一个Jedis对象(Ip,端口)
         2.调用ping()方法
         3.指令和命令行指令完全一致
  1. import redis.clients.jedis.Jedis;
  2. public class TestPing {
  3. public static void main(String[] args) {
  4. // 1、 new Jedis 对象即可
  5. Jedis jedis = new Jedis("127.0.0.1",6379);
  6. // jedis
  7. System.out.println(jedis.ping());
  8. }
  9. }

2.spring-date-redis 技术

是将Jedis做了二次封装

说明:
   在SpringBoot2.x之后,原来使用的jedis被替换成了lettuce

步骤一:坐标

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

步骤二:application.properties中加入redis相关配置

  1. # Redis数据库索引(默认为0
  2. spring.redis.database=0
  3. # Redis服务器地址
  4. spring.redis.host=192.168.0.24
  5. # Redis服务器连接端口
  6. spring.redis.port=6379
  7. # Redis服务器连接密码(默认为空)
  8. spring.redis.password=
  9. # 连接池最大连接数(使用负值表示没有限制)
  10. spring.redis.pool.max-active=200
  11. # 连接池最大阻塞等待时间(使用负值表示没有限制)
  12. spring.redis.pool.max-wait=-1
  13. # 连接池中的最大空闲连接
  14. spring.redis.pool.max-idle=10
  15. # 连接池中的最小空闲连接
  16. spring.redis.pool.min-idle=0
  17. # 连接超时时间(毫秒)
  18. spring.redis.timeout=1000

步骤三:操作说明

spring data redis中封装了两个模板类,帮助我们实现redis的crud
RedisTemplate         key value泛型都是object【不具备可读性】
StringRedisTemplate   key value泛型都是string

注意:

1.两者数据各自存,各自取,数据不互通。
         RedisTemplate不能取StringRedisTemplate存入的数据
         StringRedisTemplate不能取RedisTemplate存入的数据
2.序列化策略不同:

    RedisTemplate采用JDK的序列化策略(JdkSerializationRedisSerializer)

    保存的key和value 都是采用此策略序列化保存的


 解释:
    存储时,先将数据序列化为字节数组,再存入Redis数据库。

    查看Redis会发现,是字节数组的形式类似乱码读取时,

    会将数据当做字节数组转化为我们需要的数据,以用来存储对象,

    但是要实现Serializable接口

   StringRedisTemplate采用String的序列化策略(StringRedisSerializer)
   保存的key和value都是采用此策略序列化保存的当存入对象时,
   会报错:can not cast into String
   存储和读取,都为可读的数据

3.两者的关系是StringRedisTemplate继承RedisTemplate

4.使用场景:
   当你的redis数据库里面本来存的是字符串数据或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可。
    但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。


5.五大数据类型封装:


redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForList();//操作List
redisTemplate.opsForSet();//操作Set
redisTemplate.opsForZSet();//操作ZSet
redisTemplate.opsForHash();//操作Hash

步骤四:具体应用 

1.为了更好的使用,需要导入fastjson工具

  1. <!-- fastjson工具包 -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>fastjson</artifactId>
  5. <version>1.2.3</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.colobu</groupId>
  9. <artifactId>fastjson-jaxrs-json-provider</artifactId>
  10. <version>0.3.1</version>
  11. </dependency>

 专用字符串key value均是String

  1. @Autowired
  2. public StringRedisTemplate stringRedisTemplate;
  3. 注意:
  4. 都是string,具有可读性
  5. @Test
  6. public void stringRedisTemplate(){
  7. //1.key相关
  8. Set<String> keys = stringRedisTemplate.keys("*");//得到所有的key
  9. for (String key : keys) {
  10. System.out.println(key);
  11. }
  12. //2.各种类型支持
  13. 模板使用的方法是把原来的命令稍微修改,不会完全一致【补全eg:incr ---> increment()】
  14. stringRedisTemplate.opsForValue();
  15. stringRedisTemplate.opsForList();//List
  16. stringRedisTemplate.opsForHash();//hash
  17. stringRedisTemplate.opsForSet();//set
  18. stringRedisTemplate.opsForZSet();//zset
  19. //3.举例字符串
  20. stringRedisTemplate.opsForValue().set("name","许老师");
  21. String name = stringRedisTemplate.opsForValue().get("name");
  22. System.out.println(name);
  23. //4.操作list列表
  24. stringRedisTemplate.opsForList().leftPush("myList1","曹丕");
  25. stringRedisTemplate.opsForList().leftPush("myList1","曹植");
  26. stringRedisTemplate.opsForList().leftPushAll("mylistAll","曹操","曹丕","曹植");
  27. List<String> list = stringRedisTemplate.opsForList().range("mylistAll",0,2);
  28. System.out.println(list);
  29. }

专用对象

  1. @Autowired
  2. public RedisTemplate redisTemplate;
  3. 注意:
  4. 1. redisTemplate默认使用key序列化方式和value的序列化方式都使用的是jdk serializer序列化
  5. 所以存对象会乱码,不具备可读性
  6. 2.所有返回值为object,需要转型
  7. @Test
  8. public void show2(){
  9. ValueOperations valueOperations = redisTemplate.opsForValue();
  10. valueOperations.set("name","薛老师");
  11. String name = (String) valueOperations.get("name");
  12. System.out.println(name);
  13. redisTemplate.opsForValue();//String
  14. redisTemplate.opsForList();//List
  15. redisTemplate.opsForHash();//hash
  16. redisTemplate.opsForSet();//set
  17. redisTemplate.opsForZSet();//zset
  18. //单一存
  19. Student stu1 = new Student(1,"莫向东","24");
  20. redisTemplate.opsForValue().set("stu1",stu1);
  21. Student ss1 = (Student)redisTemplate.opsForValue().get("stu1");
  22. System.out.println(ss1);
  23. redisTemplate.opsForList().leftPushAll("mylist","睡觉","游戏");
  24. List<String> list = redisTemplate.opsForList().range("mylist",0,-1);
  25. for (int i = 0; i < list.size(); i++) {
  26. String s = list.get(i);
  27. System.out.println(s);
  28. }
  29. System.out.println("打印默认序列策略"+redisTemplate.getDefaultSerializer());
  30. }

自定义-基础版 

注意:

     需要字节写配置类,优化RedisTemplate的可读性【读官方文档】
 

  1. @Configuration
  2. public class RedisConfig {
  3. @Bean
  4. public RedisTemplate<Object, Object> jsonRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
  5. //1.创建自定义模板类
  6. RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
  7. //2.配置json类型的序列化工具
  8. template.setKeySerializer(new StringRedisSerializer());//这样key会用字符串方式保存
  9. template.setDefaultSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
  10. //3.给模板配置工厂
  11. template.setConnectionFactory(redisConnectionFactory);
  12. return template;
  13. }
  14. }
  1. @Autowired【按名字装配】
  2. public RedisTemplate jsonRedisTemplate;
  3. @Test
  4. public void show3(){
  5. //保存对象
  6. Student stu = new Student(1,"厉顾城",25);
  7. jsonRedisTemplate.opsForValue().set("stu",stu);
  8. //获取对象 ----
  9. Object s1 = jsonRedisTemplate.opsForValue().get("stu");
  10. String jsonS1 = JSONObject.toJSONString(s1);
  11. Student s11 = JSONObject.parseObject(jsonS1,Student.class);
  12. System.out.println(s11);
  13. Student stu2 = new Student(2,"厉顾城",25);
  14. Student stu1 = new Student(2,"厉顾城",25);
  15. Student stu3 = new Student(2,"厉顾城",25);
  16. List<Student> students = Arrays.asList(stu1, stu2, stu3);
  17. jsonRedisTemplate.opsForValue().set("stus",students);
  18. //必须Object接受,利用ObjectMapper对象转换,如果强制转换会报错
  19. Object data = jsonRedisTemplate.opsForValue().get("stus");
  20. String dataJson = JSONObject.toJSONString(data);
  21. //将JSON类型转为List
  22. List<Student> stus = JSONObject.parseArray(dataJson, Student.class);
  23. System.out.println(stus);
  24. }

自定义-实际应用版

把redis当做缓存中间件搭建应用程序
1.配置类同上
2.在未来还会包装一个工具类,调用工具类来操作redis
   1.作了大量的判断
   2.更健壮
 注意:

    使用@Component注入容器后,需要装配调方法
    类中使用了@Autowired注解
   【即:使用了spring注解,这个类必须是spring的一部分(注入容器)

              不把该类注入容器,此注解不会生效】

工具类的篇幅过长,链接地址:http://t.csdn.cn/fEZS1 

业务层优化:

  查询:先在redis中查询,没有,再查库,存入redis,返回
  注意:

     增删改:保证redis和数据库的数据一致【同步】

  1. @Service
  2. public class StudentService {
  3. @Autowired(required = false)
  4. StudentMapper mapper;
  5. @Autowired
  6. public RedisUtil redisUtil;
  7. public Student findById(Integer id){
  8. String key = "student:id:" + id;
  9. //1.1判断key在redis中是否存在
  10. boolean hasKey = redisUtil.hasKey(key);
  11. if (hasKey) {
  12. //1.2存在缓存则直接获取
  13. Object stu = redisUtil.get(key);
  14. ObjectMapper change = new ObjectMapper();
  15. Student student = change.convertValue(stu,Student.class);
  16. return student;
  17. } else {
  18. //1.3不存在缓存,先从数据库中获取,在保存至redis,最后返回用户
  19. Student student = mapper.getStudentById(id);
  20. if (student != null){
  21. redisUtil.set(key, student);//写入缓存
  22. }
  23. return student;
  24. }
  25. }
  26. public void deleteStudentById(Integer id){
  27. //1.删除数据库
  28. int result = mapper.deleteStudentById(id);
  29. //2.判断数据库中是否删除成功
  30. String key = "student:id:" + id;
  31. if (result != 0) {
  32. //3.判断redis中是否存在
  33. boolean hasKey = redisUtil.hasKey(key);
  34. //4.存在删除,不存在直接跳转
  35. if (hasKey) {
  36. redisUtil.del(key);
  37. System.out.println("删除了缓存中的key:" + key);
  38. }
  39. }
  40. }
  41. }

序列化策略:

改变序列化策略

     默认序列化方式存储到redis的数据人工不可读
    不同策略序列化的过程有性能高低的

spring-data-redis提供如下几种序列化策略


    GenericToStringSerializer:           可以将任何对象泛化为字符串并序列化
    Jackson2JsonRedisSerializer:    跟JacksonJsonRedisSerializer实际上是一样的
    JacksonJsonRedisSerializer:      序列化object对象为json字符串
    JdkSerializationRedisSerializer: 序列化java对象
    StringRedisSerializer:                   简单的字符串序列化


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/906964
推荐阅读
相关标签
  

闽ICP备14008679号