ToB企服应用市场:ToB评测及商务社交产业平台

标题: Redis的Java客户端 [打印本页]

作者: 滴水恩情    时间: 2022-12-1 12:51
标题: Redis的Java客户端
Redis的Java客户端

Jedis线程不安全,lettuce线程安全
Jedis

测试

引入依赖
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>redis.clients</groupId>
  4.         <artifactId>jedis</artifactId>
  5.         <version>3.7.0</version>
  6.     </dependency>
  7.     <dependency>
  8.         <groupId>org.junit.jupiter</groupId>
  9.         <artifactId>junit-jupiter</artifactId>
  10.         <version>5.7.0</version>
  11.     </dependency>
  12. </dependencies>
复制代码
Test.java
  1. public class JedisTest {
  2.     private Jedis jedis;
  3.     @BeforeEach
  4.     void setUp() {
  5.         //1.建立连接
  6.         jedis=new Jedis("192.168.164.128",6379);
  7.         //2.设置密码
  8.         jedis.auth("123456");
  9.         //3.选择库
  10.         jedis.select(0);
  11.     }
  12.     @Test
  13.     void testString() {
  14.         //存入
  15.         String result=jedis.set("name","熊哥");
  16.         System.out.println("result="+result);
  17.         //获取
  18.         String name=jedis.get("name");
  19.         System.out.println("name="+name);
  20.         //存入
  21.         jedis.hset("user:1","name","Jack");
  22.         jedis.hset("user:1","age","21");
  23.         //获取
  24.         Map<String, String> map = jedis.hgetAll("user:1");
  25.         System.out.println(map);
  26.     }
  27.     @AfterEach
  28.     void tearDown() {
  29.         //关闭连接
  30.         if(jedis!=null){
  31.             jedis.close();
  32.         }
  33.     }
  34. }
复制代码
Jedis连接池

Jedis本身是线程不安全的,且频繁的创建和销毁连接有性能损耗,因此推荐使用Jedis连接池代替Jedis直接连接
JedisConnectionFactory.java
  1. public class JedisConnectionFactory {
  2.     //连接池对象
  3.     private static final JedisPool jedisPool;
  4.     //初始化
  5.     static {
  6.         //配置连接池
  7.         JedisPoolConfig poolConfig = new JedisPoolConfig();
  8.         poolConfig.setMaxTotal(8);  //最大8个连接
  9.         poolConfig.setMaxIdle(8);   //最大空闲数量
  10.         poolConfig.setMinIdle(0);   //最小空闲数量
  11.         poolConfig.setMaxWaitMillis(1000);  //当池内没有返回对象时最大等待时间
  12.         //创建连接池对象(JedisPoolConfig,ip,port,timeout,password)
  13.         jedisPool=new JedisPool(poolConfig,"192.168.164.128",6379,1000,"123456");
  14.     }
  15.     public static Jedis getJedis(){
  16.         return jedisPool.getResource();
  17.     }
  18. }
复制代码
Test.java(改变建立连接的语句)
  1. public class JedisTest {
  2.     private Jedis jedis;
  3.     @BeforeEach
  4.     void setUp() {
  5.         //1.建立连接
  6. //        jedis=new Jedis("192.168.164.128",6379);
  7.         jedis= JedisConnectionFactory.getJedis();
  8.         //2.设置密码
  9.         jedis.auth("123456");
  10.         //3.选择库
  11.         jedis.select(0);
  12.     }
  13.     @Test
  14.     void testString() {
  15.         //存入
  16.         String result=jedis.set("name","熊哥");
  17.         System.out.println("result="+result);
  18.         //获取
  19.         String name=jedis.get("name");
  20.         System.out.println("name="+name);
  21.         //存入
  22.         jedis.hset("user:1","name","Jack");
  23.         jedis.hset("user:1","age","21");
  24.         //获取
  25.         Map<String, String> map = jedis.hgetAll("user:1");
  26.         System.out.println(map);
  27.     }
  28.     @AfterEach
  29.     void tearDown() {
  30.         //关闭连接
  31.         if(jedis!=null){
  32.             jedis.close();
  33.         }
  34.     }
  35. }
复制代码
SpringDataRedis

SpringDataRedis中提供RedisTemplate工具类,封装了各种对Redis的操作。springboot2.x以前默认支持Jedis,以后默认支持lettuce
依赖
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.apache.commons</groupId>
  7.     <artifactId>commons-pool2</artifactId>
  8. </dependency>
复制代码
application.yaml
  1. spring:
  2.   redis:
  3.     host: 192.168.164.128
  4.     port: 6379
  5.     password: 123456
  6.     database: 0
  7.     lettuce:
  8.       pool:
  9.         max-active: 8
  10.         max-idle: 8
  11.         min-idle: 0
  12.         max-wait: 100ms
复制代码
Test.java
  1. @SpringBootTest
  2. class RedisDemoApplicationTests {
  3.     @Resource
  4.     private RedisTemplate<String,Object> redisTemplate;
  5.     @Test
  6.     void contextLoads() {
  7.         //写入一条String数据
  8.         redisTemplate.opsForValue().set("name","王五");
  9.         //获取
  10.         Object name=redisTemplate.opsForValue().get("name");
  11.         System.out.println(name);
  12.     }
  13. }
复制代码
序列化以实现跨平台存储(在上面的基础上修改)

添加配置类RedisConfig.java
  1. @Configuration
  2. public class RedisConfig {
  3.     @Bean
  4.     public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
  5.         //创建RedisTemplate对象
  6.         RedisTemplate<String, Object> template = new RedisTemplate<>();
  7.         //设置连接工厂
  8.         template.setConnectionFactory(connectionFactory);
  9.         //创建JSON序列化工具
  10.         GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
  11.         //设置Key的序列化
  12.         template.setKeySerializer(RedisSerializer.string());
  13.         template.setHashKeySerializer(RedisSerializer.string());
  14.         //设置Value的序列化
  15.         template.setValueSerializer(jsonRedisSerializer);
  16.         template.setHashValueSerializer(jsonRedisSerializer);
  17.         //返回
  18.         return template;
  19.     }
  20. }
复制代码
Test.java中修改下面这行
  1. private RedisTemplate<String,Object> redisTemplate;
复制代码
若linux下还是显示乱码,在启动客户端时最后加上 --raw
StringRedisTemplate(上面的经典白学)

Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认是String方式。省去了自定义RedisTemplate的过程
Test.java
  1. @SpringBootTest
  2. public class RedisStringTest {
  3.     @Autowired
  4.     private StringRedisTemplate stringRedisTemplate;
  5.     @Test
  6.     void contextLoads() {
  7.         //写入一条String数据
  8.         stringRedisTemplate.opsForValue().set("name","王五");
  9.         //获取
  10.         Object name=stringRedisTemplate.opsForValue().get("name");
  11.         System.out.println(name);
  12.     }
  13. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4