Redis
本文最后更新于 2025年7月13日 早上
Redis学习记录
Sql与Nosql区别
Redis简介
安装redis
- 如何看redis是否已经运行
- ps -ef | grep redis
Redis的value类型

帮助:在redis-cli中输:help @然后按tab键进行切换
常用命令

- 过期时间中 -1是永久存在,-2是已经到期
String类型

- 常见命令

- incrbyfloat没有默认增长,后面必须要加增长多少,没有默认增长
- setNx是新增不存在的
set name zhangsan nx和setNx name zhangsan效果是一样的
- setEx
setex name 10 Jack跟set name Jack ex 19效果是一样的
- DEL 删除,并且可以批量删除
Key的结构
Hash类型


- HMset:set的时候可以把键放在前面,然后面直接就是多个kv kv kv
- HMget:get的时候可以把所有的键写下来,k k k k
- HgetALL:直接写顶级的,一级key,就能把所有的子集数据展示出来
- HsetNx:是判断field存不存在,不是顶级key了
List类型

- BLPOP中的B是block,阻塞的意思


- BLPOP的语法是 BLPOP [key] [timeout],就是如果找不到就一直阻塞在那边,如果在阻塞的同时添加一个键进去,那边阻塞立马就会结束并且返回键中的最L值,同理BRPOP也是如此
Set类型
SortedSet类型


- 默认升序,ZRank是升序,ZREVRank是降序,加REV是直接在Z后面加的,REV指的是reverse(反转)
- zcount是针对分数score的,zrange是针对排名的范围,count是查数量,range是查元素,查人名的
Redis的Java客户端
- Redis的Java客户端

Jedis
- jedis中方法名和redis是一致的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49public class JedisTest {
private Jedis jedis;
@BeforeEach
void setup(){
//连接
jedis = new Jedis("ip",6379);
//密码
jedis.auth("redis");
//选择库
jedis.select(1);
}
@Test
void testString(){
// 存
String set = jedis.set("name", "Odyssey");
System.out.println("set = "+set);
// 取
String name = jedis.get("name");
System.out.println("name = "+name);
}
@Test
void testHash(){
jedis.hset("user:1", "name", "Odyssey");
String name = jedis.hget("user:1", "name");
System.out.println("name = "+name);
HashMap<String, String> map = new HashMap<>();
map.put("name", "Odyssey");
map.put("age", "18");
map.put("sex", "男");
map.put("address", "中国");
String hmset = jedis.hmset("user:1", map);
System.out.println("hmset = "+hmset);
Map<String, String> stringStringMap = jedis.hgetAll("user:1");
System.out.println("stringStringMap = "+stringStringMap);
String age = jedis.hget("user:1", "age");
System.out.println("age = "+age);
}
@AfterEach
void close(){
if(jedis!=null){
jedis.close();
}
}
}
Jedis连接池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public class JedisConnectionFactory {
private static final JedisPool jedisPool;
/*
执行机制:静态代码块会在类被加载的时候自动执行,
而且仅执行一次,这确保了连接池会在应用启动时就完成初始化
*/ static {
//配置连接池
JedisPoolConfig poolConfig = new JedisPoolConfig();
//最大连接数
poolConfig.setMaxTotal(8);
//最大空闲连接数
poolConfig.setMaxIdle(8);
// 最小空闲连接数
poolConfig.setMinIdle(0);
// 获取连接时的最大等待毫秒
poolConfig.setMaxWaitMillis(1000);
// 创建连接池对象
jedisPool = new JedisPool(poolConfig, "ip/hostname", 6379, 1000, "pwd");
}
public static Jedis getJedis() {
return jedisPool.getResource();
}
}
SpringDataRedis


快速入门
- 引入依赖(access+driver)

- 编写application.yml配置

- 注入RedisTemplate
SpringRedisData序列化方式

key和HashKey使用RedisSerializer
value的序列化一般采用GenericJackson2JsonRedisSerializer来序列化
如果没有引入springmvc或者springweb依赖注意要加一个jackson-databind;
为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

StringRedisTemplate

- ObjectMapper是用SpringMVC中自带的序列化工具,也可以用FastJSON
- 现在保存到数据库之前要手动序列化,然后读取的时候要手动的反序列化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19@Autowired
private StringRedisTemplate stringRedisTemplate;
private static final ObjectMapper objectMapper = new ObjectMapper();
@Test
void testSaveUser() throws JsonProcessingException {
// 写入
// redisTemplate.opsForValue().set("user",new User("OdysseyChan",17));
User u = new User("张三", 17);
// 手动序列化
String json = objectMapper.writeValueAsString(u);
stringRedisTemplate.opsForValue().set("user:200",json);
// 获取数据
String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
// 手动反序列化
User user = objectMapper.readValue(jsonUser, User.class);
System.out.println("user = " + user);
} - 整个测试类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43@SpringBootTest
class RedisDemoApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void testRedisTemplate() {
//写入
redisTemplate.opsForValue().set("name", "OdysseyChan");
//读取
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
private static final ObjectMapper objectMapper = new ObjectMapper();
@Test
void testSaveUser() throws JsonProcessingException {
// 写入
// redisTemplate.opsForValue().set("user",new User("OdysseyChan",17));
User u = new User("张三", 17);
// 手动序列化
String json = objectMapper.writeValueAsString(u);
stringRedisTemplate.opsForValue().set("user:200", json);
// 获取数据
String jsonUser = stringRedisTemplate.opsForValue().get("user:200");
// 手动反序列化
User user = objectMapper.readValue(jsonUser, User.class);
System.out.println("user = " + user);
}
@Test
void testHash() {
stringRedisTemplate.opsForHash().put("user:300", "name", "刘能");
stringRedisTemplate.opsForHash().put("user:300", "age", "18");
Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries("user:300");
System.out.println("entries = " + entries);
}
}
总结
目前Redis这里先是从redis的基础语法包括String 、Hash、List、Set、SortedSet,学习了解如何存取并且设置存活时间,接着学习在Java项目中使用jedis和lettuce进行操作存取,然后学习了使用jedis连接池来获取jedis对象,最后使用SpringDataRedis来进行操作redis,其中包括为避免序列中存储的额外开销而使用StringRedisTemplate
Redis
http://yething.github.io/posts/3135569683.html






