redis介绍
作者:jelly
花名:果冻
写于:2021.8.24
更新时间:2022.6.29
1.背景
1.高并发
2.数据量大
2.定义
非关系性数据库,特征如下:
1.数据存储内存
2.存储的数据表无对应关系
3.常用基本类型
- string
添加/获取/删除操作
127.0.0.1:6379> set name guozhong
OK
127.0.0.1:6379> get name
"guozhong"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
127.0.0.1:6379> mset name guozhong age 27
OK
127.0.0.1:6379> mget name age
1) "guozhong"
2) "27"
127.0.0.1:6379> strlen name
(integer) 8
127.0.0.1:6379> append name haoren
(integer) 14
127.0.0.1:6379> get name
"guozhonghaoren"
127.0.0.1:6379>
127.0.0.1:6379> incr money
(integer) 1
127.0.0.1:6379> get money
"1"
127.0.0.1:6379> incrby money
(error) ERR wrong number of arguments for 'incrby' command
127.0.0.1:6379> incrby money 2
(integer) 3
127.0.0.1:6379> get money
"3"
127.0.0.1:6379> decrby money 1
(integer) 2
127.0.0.1:6379> get noney
(nil)
127.0.0.1:6379> get money
"2"
127.0.0.1:6379>
- hash
127.0.0.1:6379> hset user fans 80
(integer) 1
127.0.0.1:6379> hget user
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hget user fans
"80"
127.0.0.1:6379> hdel user fans
(integer) 1
127.0.0.1:6379> hget user fans
(nil)
127.0.0.1:6379>
127.0.0.1:6379> hmset user name guozhong age 28
OK
127.0.0.1:6379> hmget user name age
1) "guozhong"
2) "28"
127.0.0.1:6379> hlen user
(integer) 2
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user age
(integer) 1
127.0.0.1:6379> hexists user hh
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> hkeys user
1) "name"
2) "age"
127.0.0.1:6379> hvals user
1) "guozhong"
2) "28"
127.0.0.1:6379>
- list
略 - set
略
4.redis通用指令
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> expire name 2
(integer) 0
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> keys name
(empty array)
127.0.0.1:6379> keys *
1) "money"
2) "user"
3) "age"
127.0.0.1:6379> rename money name
OK
127.0.0.1:6379> get name
"2"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> ping
PONG
127.0.0.1:6379[1]> echo hh
"hh"
127.0.0.1:6379[1]> quit
5.java实现连接redis
pom.xml
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
/**
* 测试连接redis服务
*/
public class TestRedis {
public static void main(String[] args) {
String ip="192.168.66.161";
int port=6379;
Jedis jedis=new Jedis(ip, port);
jedis.set("test1","hello world");
System.out.println(jedis.get("test1"));
jedis.close;
}
控制台输出 hell world
6.redis持久化
RDB
将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据
1)执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回。
2)父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒。
3)父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。
4)子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项。
5)进程发送信号给父进程表示完成,父进程更新统计信息,具体见info Persistence下的rdb_*相关选项。
AOF
将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程
1)所有的写入命令会追加到aof_buf(缓冲区)中。
2)AOF缓冲区根据对应的策略向硬盘做同步操作。
3)随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
4)当Redis服务器重启时,可以加载AOF文件进行数据恢复。
次部分参考https://blog.csdn.net/fjj15732621696/article/details/81842075
7.redis事务
multi 开启
exec 执行
discard 取消事务
watch 监听事务
unwatch 取消事务
setnx 设置锁
expire 释放锁
7.主从复制
全量复制-部分复制
RDB AOF
slaveof ip port
8.哨兵模式
9.集群模式
略
10.springboot项目应用
maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!--<version>2.1.4.RELEASE</version>-->
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
redis序列化方式配置
@Configuration
public class RedisConfig {
/**
* 设置Redis序列化方式,默认使用的JDKSerializer的序列化方式,效率低,这里我们使用 FastJsonRedisSerializer
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
// value序列化
redisTemplate.setValueSerializer(new FastJsonRedisSerializer<>(Object.class));
// Hash key序列化
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// Hash value序列化
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
1:Redis的String数据结构
设置当前的key以及value值
redisTemplate.opsForValue().set(key, value)
redisTemplate.opsForValue().set("num","123");
参考文档
https://blog.csdn.net/lanfeng_lan/article/details/121152461