redis在项目中运用(基础)

锦通  论坛元老 | 2024-10-15 14:05:42 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1584|帖子 1584|积分 4752

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
mysql学完命令之后,学过jdbc。
redis也要使用Java毗连redis数据库
   1.Jedis
  2.RedisTemplate[重点]
  1、Jedis【相识】

jedis是redis的java版本的客户端实现,jedis中提供了针对redis命令的操作
1.1导入jar文件

Maven方式
  1. <dependency>
  2.    <groupId>redis.clients</groupId>
  3.    <artifactId>jedis</artifactId>
  4.    <version>3.3.0</version>
  5. </dependency>
复制代码
测试
入门案例
  1. package com.qf.day63_redis.jedis;
  2. import redis.clients.jedis.Jedis;
  3. /**
  4. * ---厚德载物---
  5. *
  6. * @Author wangbo
  7. * @Date 2024/10/11
  8. * @Desc 人的一生适可而止
  9. */
  10. public class App {
  11.    public static void main(String[] args) {
  12.        //1.创建jedis对象
  13.        Jedis jedis = new Jedis("127.0.0.1", 6379);
  14.        System.out.println(jedis);
  15.        //2.设置一个数据
  16.        jedis.set("likeNum", "100");
  17.        //.3获取数据
  18.        String s = jedis.get("likeNum");
  19.        System.out.println(s);
  20.    }
  21. }
复制代码
像一个问题? windows版本的redis 启动时间默认是没有密码的
怎样设置密码启动?
   1.找到redis.window.conf
  找到503行 requirepass root(自己定义的密码)
  2.启动 使用命令启动
  redis-server redis.windows.conf
  1. package com.qf.day63_redis.jedis;
  2. import redis.clients.jedis.Jedis;
  3. /**
  4. * ---厚德载物---
  5. *
  6. * @Author wangbo
  7. * @Date 2024/10/11
  8. * @Desc 人的一生适可而止
  9. */
  10. public class App {
  11.    public static void main(String[] args) {
  12.        //1.创建jedis对象
  13.        Jedis jedis = new Jedis("127.0.0.1", 6379);
  14.        //1.1设置密码 如果有密码启动的时候  才取设置的!!!
  15.        jedis.auth("root");
  16.        System.out.println(jedis);
  17.        //2.设置一个数据
  18.        jedis.set("likeNum", "100");
  19.        //.3获取数据
  20.        String s = jedis.get("likeNum");
  21.        System.out.println(s);
  22.    }
  23. }
复制代码
1.2JedisPool

   Jedis对象并不是线程安全的,在多线程下使用同一个Jedis对象会出现并发问题。为了制止每次使用Jedis对象时都需要重新构建,Jedis提供了JedisPool。JedisPool是基于Commons Pool 2实现的一个线程安全的毗连池。如果使用jedis毗连池,需要commons-pool2的jar包
  1. package com.qf.day63_redis.jedis;
  2. import redis.clients.jedis.Jedis;
  3. import redis.clients.jedis.JedisPool;
  4. import redis.clients.jedis.JedisPoolConfig;
  5. /**
  6. * ---厚德载物---
  7. *
  8. * @Author wangbo
  9. * @Date 2024/10/11
  10. * @Desc 人的一生适可而止
  11. */
  12. public class JedisUtils {
  13.    //1.声明连接池的对象
  14.    private static JedisPool jedisPool = null;
  15.    static {
  16.        //2.创建redisPool连接池的配置对象
  17.        JedisPoolConfig config = new JedisPoolConfig();
  18.        //最多与多少个jedis对象
  19.        config.setMaxTotal(50);
  20.        //最多有多少空闲的jedis对象
  21.        config.setMaxIdle(20);
  22.        //最大等待时间
  23.        config.setMaxWaitMillis(5000);
  24.        //检查连接的有效性
  25.        config.setTestOnBorrow(true);
  26.        //第二个参数:redis服务器的ip
  27.        //第三个参数:端口
  28.        //第四个参数:连接服务器的超时时间
  29.        //第五个参数:密码
  30.        //创建redis连接池对象
  31.        jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000, "root");
  32.    }
  33.    //封装好一个方法,获取Jedis对象
  34.    public static Jedis getJedis() {
  35.        Jedis jedis = jedisPool.getResource();
  36.        return jedis;
  37.    }
  38.    //jedis放回池子中
  39.    public  static void close(Jedis jedis) {
  40.        jedis.close();//
  41.    }
  42. }
复制代码
2、在springboot 中集成redis

2.1RedisTemplate

spring-data-redis的jar中,提供在spring应用中通过简单的设置访问redis服务的功能,它对reids底层开发包进行了高度封装。
针对reids的操作,包中提供了RedisTemplate类和StringRedisTemplate类,其中StringRedisTemplate是RedisTemplate的子类,该类只支持key和value为String的操作
2.2重要封装接口

RedisTemplate针对差别数据类型的操作进行封装,将同一类型操作封装为Operation接口
ValueOperations:简单K-V操作,获取方式 redisTemplate.opsForValue();
SetOperations:set类型数据操作,获取方式 redisTemplate.opsForSet();
ZSetOperations:zset类型数据操作,获取方式 redisTemplate.opsForZSet();
HashOperations:针对hash类型的数据操作, 获取方式 redisTemplate.opsForHash();
ListOperations:针对list类型的数据操作,获取方式 redisTemplate.opsForList();
2.3序列化策略

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: 序列化object对象为json字符串
JdkSerializationRedisSerializer: 序列化java对象(被序列化的对象必须实现Serializable接口)
StringRedisSerializer: 简单的字符串序列化
GenericToStringSerializer:类似StringRedisSerializer的字符串序列化
GenericJackson2JsonRedisSerializer:类似Jackson2JsonRedisSerializer,但使用时构造函数不用特定的类
【留意】: 存储数据的时间指定 序列化策略
2.4导入jar

  1. <!-- redis -->
  2. <dependency>
  3.  <groupId>org.springframework.boot</groupId>
  4.  <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!-- pool 对象池 -->
  7. <dependency>
  8.  <groupId>org.apache.commons</groupId>
  9.  <artifactId>commons-pool2</artifactId>
  10. </dependency>
复制代码
在SpringBoot 1.5.x版本默认的Redis客户端是Jedis实现的,SpringBoot 2.x版本默认客户端是用lettuce实现的
2.5yml中设置

  1.  # redis 配置
  2.   spring:
  3.    redis:
  4.      # 地址
  5.      host: 127.0.0.1
  6.      # 端口,默认为6379
  7.      port: 6379
  8.      # 数据库索引
  9.      database: 0
  10.      # 密码
  11.      password: root
  12.      # 连接超时时间
  13.      timeout: 10s
  14.      lettuce:
  15.        pool:
  16.          # 连接池中的最小空闲连接
  17.          min-idle: 0
  18.          # 连接池中的最大空闲连接
  19.          max-idle: 8
  20.          # 连接池的最大数据库连接数
  21.          max-active: 8
  22.          # #连接池最大阻塞等待时间(使用负值表示没有限制)
  23.          max-wait: -1ms
复制代码
2.6redis设置类

SpringBoot自动在容器中创建了RedisTemplate对象和StringRedisTemplate对象。但是,RedisTemplate的泛型是<Object,Object>,进行数据处理时比价贫苦,我们需要自定义一个RedisTemplate对象
  1. package com.qf.day63_redis.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
  7. import org.springframework.data.redis.serializer.StringRedisSerializer;
  8. import javax.annotation.Resource;
  9. /**
  10. * ---厚德载物---
  11. *
  12. * @Author wangbo
  13. * @Date 2024/10/11
  14. * @Desc 人的一生适可而止
  15. */
  16. @Configuration
  17. public class RedisConfig {
  18.    @Resource
  19.    //lettuceConnectionFactory  创建lettuce对象的
  20.    private LettuceConnectionFactory lettuceConnectionFactory;
  21.    //自定义redisTemplate对象
  22.    @Bean
  23.    public RedisTemplate<String,Object> redisTemplate() {
  24.        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  25.        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
  26.        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  27.        //key采用String的序列化方式
  28.        redisTemplate.setKeySerializer(stringRedisSerializer);
  29.        // value序列化方式采用jackson
  30.        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  31.        // hash的key也采用String的序列化方式
  32.        redisTemplate.setHashKeySerializer(stringRedisSerializer);
  33.        // hash的value序列化方式采用jackson
  34.        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
  35.        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
  36.        return redisTemplate;
  37.    }
  38. }
复制代码
直接测试
  1. package com.qf.day63_redis;
  2. import com.qf.day63_redis.entity.User;
  3. import org.junit.jupiter.api.Test;
  4. import org.springframework.boot.test.context.SpringBootTest;
  5. import org.springframework.data.redis.core.RedisTemplate;
  6. import javax.annotation.Resource;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. @SpringBootTest
  10. class Day63RedisApplicationTests {
  11.    @Resource
  12.    private RedisTemplate<String, Object> redisTemplate;
  13.    @Test
  14.    void contextLoads() {
  15.        redisTemplate.opsForValue().set("viewNum", 1000);
  16.        Integer num = (Integer)redisTemplate.opsForValue().get("viewNum");
  17.        System.out.println(num);
  18.    }
  19.    @Test
  20.    void test1 () {
  21.        User user = new User();
  22.        user.setName("狗蛋");
  23.        user.setAge(21);
  24.        redisTemplate.opsForValue().set("user", user);
  25.        //{"@class":"com.qf.day63_redis.entity.User","name":"狗蛋","age":21}
  26.    }
  27.    @Test
  28.    void test2 () {
  29.        User user = new User();
  30.        user.setName("狗蛋");
  31.        user.setAge(21);
  32.        User user1 = new User();
  33.        user1.setName("狗蛋1");
  34.        user1.setAge(22);
  35.        User user2 = new User();
  36.        user2.setName("狗蛋2");
  37.        user2.setAge(22);
  38.        List<User> list = new ArrayList<>();
  39.        list.add(user);
  40.        list.add(user1);
  41.        list.add(user2);
  42.        redisTemplate.opsForValue().set("userList", list);
  43.        List<User> list1  = (List<User>)redisTemplate.opsForValue().get("userList");
  44.        System.out.println(list1);
  45.        //
  46.        //["java.util.ArrayList",[{"@class":"com.qf.day63_redis.entity.User","name":"狗蛋","age":21},{"@class":"com.qf.day63_redis.entity.User","name":"狗蛋1","age":22},{"@class":"com.qf.day63_redis.entity.User","name":"狗蛋2","age":22}]]
  47.    }
  48. }
复制代码
发现对redis数据库操作的时间,还得写ops方法 再根set get del 操作
有一个想法,把这些操作封装到 一个类中,直接使用类调用方法即可
RedisUtils工具类
工具类的第一种写法:
  1. package com.qf.day63_redis.utils;
  2. import org.springframework.data.redis.core.RedisTemplate;
  3. import org.springframework.stereotype.Component;
  4. import javax.annotation.Resource;
  5. /**
  6. * ---厚德载物---
  7. *
  8. * @Author wangbo
  9. * @Date 2024/10/11
  10. * @Desc 人的一生适可而止
  11. */
  12. @Component//把工具类放到了容器中了
  13. public class RedisUtils {
  14.    @Resource
  15.    private RedisTemplate<String, Object> redisTemplate;//直接注入
  16.    public static void setValue (String key, Object value) {
  17.        redisTemplate.opsForValue().set(key, value);
  18.    }
  19. }
复制代码
使用
  1. @Test
  2.    void test4 () {
  3.        User user1 = new User();
  4.        user1.setName("狗蛋1");
  5.        user1.setAge(22);
  6.        redisUtils.setValue("user1", user1);
  7.    }
复制代码
工具类的第二种写法:
就是方法中加了static修饰符 无法 在RedisUtils中注入redisTemplate的对象的
只能借助于一个叫SpringBeanUtils 自己写的工具类型
  1. package com.qf.day63_redis.utils;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.ApplicationContextAware;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. *---厚德载物---
  8. *@Author wangbo
  9. *@Date 2024/10/11
  10. *@Desc
  11. * 人的一生适可而止
  12. *
  13. */
  14. @Component
  15. public class SpringBeanUtils implements ApplicationContextAware {
  16.    /**
  17.     * Spring应用上下文对象
  18.     */
  19.    private static ApplicationContext applicationContext = null;
  20.    /**
  21.     * 注入上下文对象
  22.     *
  23.     * @param applicationContext
  24.     * @throws BeansException
  25.     */
  26.    @Override
  27.    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  28.        SpringBeanUtils.applicationContext = applicationContext;
  29.    }
  30.    /**
  31.     * 根据名称获取bean对象
  32.     *
  33.     * @param name
  34.     * @param <T>
  35.     * @return
  36.     * @throws BeansException
  37.     */
  38.    public static <T> T getBean(String name) {
  39.        return (T) applicationContext.getBean(name);
  40.    }
  41.    /**
  42.     * 根据类型获取bean对象
  43.     *
  44.     * @param clz
  45.     * @param <T>
  46.     * @return
  47.     */
  48.    public static <T> T getBean(Class<T> clz) {
  49.        T result = (T) applicationContext.getBean(clz);
  50.        return result;
  51.    }
  52. }
复制代码
第二种写法的工具类
  1. package com.qf.day63_redis.utils;
  2. import org.springframework.data.redis.core.RedisTemplate;
  3. /**
  4. * ---厚德载物---
  5. *
  6. * @Author wangbo
  7. * @Date 2024/10/11
  8. * @Desc 人的一生适可而止
  9. */
  10. public class RedisUtils1 {
  11.    //不要使用@Resource注入redisTemplate这个对象了
  12.    //但是需要redisTemplate对象  咋办? 写一个工具类 获取bean对象的工具类
  13.    private static  RedisTemplate<String , Object> redisTemplate = SpringBeanUtils.getBean("redisTemplate");
  14.    public static  void setValue (String key, Object value) {
  15.        redisTemplate.opsForValue().set(key, value);
  16.    }
  17. }
复制代码
测试
  1. @Test
  2. void test5 () {
  3.    User user1 = new User();
  4.    user1.setName("xixi");
  5.    user1.setAge(25);
  6.    RedisUtils1.setValue("user2", user1);
  7. }
复制代码
  项目中杂加redis
  1.导包
  2.yml文件
  
  2.设置类
  3.工具类型
  以上全部黏贴复制!!!!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表