
目录
Jedis里的许多方法名就是命令名称
- <dependency>
- <groupId>redis.clientsgroupId>
- <artifactId>jedisartifactId>
- <version>3.2.0version>
- dependency>
- private Jedis jedis ;
-
- //这个注释意思是每次@Test方法前都会执行的这段,下面每个@Test就不用重复写这段了,抽取出来
- //@BeforeEach表示执行测试方法之前会先执行该方法
- @BeforeEach
- void setUp() {
- //建立连接
- jedis = new Jedis ("192.168.150.101",6379) ;
- //设置密码
- jedis. auth("123321") ;
- //选择库
- jedis . select(0);
- }
- @Test
- void testString() {
- //插入数据,方法名称就是redis命令名称,非常简单
- String result = jedis.set("name","张三");
- System.out.printlf("result =”+ result);
- //获取数据
- String name = jedis.get("name");
- System.out.println("name = " + name);
- }
- @Test
- void testHash() {
- //插入hash 数据
- jedis.hset("user:1","name","Jack") ;
- jedis.hset("user:1","age","21") ;
- //获取
- Map
map = jedis.hgetAll(" user:1"); - System.out.println(map) ;
- }
- @AfterEach
- void tearDown() {
- //释放资源
- if (jedis != null) {
- jedis. close();
- }
- }
Jedis是线程不安全的,如果说在多线程的环境下并发的去访问,大家都来去使用,Jedis是有可能出现线程安全问题的,在并发的环境下,Jedis一定要给每一个线程创建独立的对象,那此时最好的方案是使用线程池,因为频繁的创建和销毁这类的对象是有很大的一个线程损耗的。
JedisPool里是连接的一些参数,Config传的是池的一些参数。
最大连接:这个连接池最多创建8个连接,再多就不行了。
最大空闲连接:即使没有人来连接连接池,那么这个连接池最多也可以预备八个连接,这样如果有人来了,就可以直接拿来用,不用在创建连接了。
最小空闲连接:这些空闲连接在一段时间后就会被清理,设置最小空闲连接用来保留n个连接不被清理。最长等待时间:当连接池里没有连接可用的时候,我们要不要等待?等待多长时间?默认值为-1,无限等待,直到有新的空闲连接为止。
- @BeforeEach
- void setUp() {
- // 1.建立连接
- // jedis = new Jedis("192.168.150.101",6379) ;
- jedis = JedisConnectionFactory.getJedis();
- // 2.设置密码
- jedis.auth( password:"123321");
- // 3.选择库
- jqdis.select(0) ;
- }

Redis将命令根据类型进行了分组,而RedisTemplate也做了这件事,内部根据类型提供了各种API,返回不同的对象,对象里面封装的就是对于该类型的各种操作,利用对象封装的形式,把不同数据类型的方法封装到不同对象里去了。

- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-redisartifactId>
- dependency>
- <dependency>
- <groupId>org.apache.commonsgroupId>
- <artifactId>commons-pool2artifactId>
- dependency>
- spring:
- redis:
- host: 192.168.150.101
- port: 6379
- password: 123321
- lettuce: #此时可以用lettuce也可以用jedis
- pool:
- max-active: 8 #最大连接
- max-idle: 8 #最大空闲连接
- min-idle: 0 #最小空闲连接
- max-wait: 100ms #连接等待时间

- @Autowired
- private RedisTemplate redisTemplate;
- @SpringBootTest
- public class RedisTest {
- @Autowired
- private RedisTemplate redisTemplate;
- @Test
- void testString() {
- //插入一条string类型数据
- redisTemplate.opsForValue().set("name","李四") ;
- //读取一条string类型数据
- Object name = redisTemplate.opsForValue().get("name") ;
- System.out.println("name=”+name) ;
- }
- }

SpringDataRedis的使用步骤:
1.引入spring-boot-starter-data-redis依赖
2.在application.yml配置Redis信息
3.注入RedisTemplate
上述测试出现的问题:

剖析:

默认的JDK序列化方式:

解决:更改RedisTemplate的序列化方式
一般key都为字符串,故key序列化用StringRedisSerializer
一般value都是对象,建议使用GenericJackson2JsonRedisSerializer


定义一个Bean叫做RedisTemplate,定义泛型key是string,value是object,先创建Template,然后连接工厂,连接工厂由springboot创建,我们只需要注入进来即可,然后设置序列化工具,一顿操作之后把redisTemplate返回。
- @Configuration
- public class RedisConfig extends CachingConfigurerSupport {
-
- @Bean
- public RedisTemplate
redisTemplate(RedisConnectionFactory factory) { - //创建RedisTemplate对象
- RedisTemplate
template = new RedisTemplate<>(); -
- //创建字符串序列化工具
- RedisSerializer
redisSerializer = new StringRedisSerializer(); -
- //创建并设置JSON序列化工具
- Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
- ObjectMapper om = new ObjectMapper();//Objectmapper是jackson的依赖,目的把对象写成json格式
- om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
- om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
- jackson2JsonRedisSerializer.setObjectMapper(om);
-
- //设置连接工厂
- template.setConnectionFactory(factory);
- //设置key序列化方式
- template.setKeySerializer(redisSerializer);
- template.setHashKeySerializer(redisSerializer);
- //设置value序列化方式
- template.setValueSerializer(jackson2JsonRedisSerializer);
- template.setHashValueSerializer(jackson2JsonRedisSerializer);
- return template;
- }
- }
value(“虎哥”)作为 字符串可以正常传入了

value作为对象也可以正常传入

当获取结果的时候还能自动地反序列化成对象(存的时候将对象转化为JSON,取的时候将JSON转换为对象)。
将JSON反序列化为对象需要@class字节码来标识需要转化为哪个对象。



存储结果:

RedisTemplate的两种序列化实践方案
方案一:
1.自定义RedisTemplate
2.修改RedisTemplate的序列化器 为Generi cJackson2JsonRedisSerializer
方案二:
1.使用StringRedisTemplate
2.写 入Redis时,手动把对象序列化为JSON
3.读取Redis时, 手动把读取到的JSON反序列化为对象
在hash里面一个key可以对应多个值
注意,Hash类型存数据不用hset

而是用put(因为对应JAVA中的HashMap,干脆直接用put了,更接近Java的编程习惯)

- @Test
- void testHash() {
- stringRedisTemplate.opsForHash().put("user:400","name","虎哥");
- stringRedisTemplate.opsForHash().put("user:400","age","21");
- Map
- System.out.println("entries =”+ entries);
- }