位置
/usr/local/src/redis-6.2.6
启动进入Redis目录下的src目录
./redis-server
./redis-cli -p 6379
配置 Redis 为后台服务 将配置文件中的 daemonize no 改成 daemonize yes,配置 redis 为后台启动。
Redis 设置访问密码 在配置文件中找到 requirepass,去掉前面的注释,并修改后面的密码。
常用配置文件例子 redis.conf
#默认端口6379
port 6379
#绑定ip,如果是内网可以直接绑定 127.0.0.1, 或者忽略, 0.0.0.0是外网、注释掉连接外网
# bind 0.0.0.0
#守护进程启动
daemonize yes
#超时
timeout 300
loglevel notice
#分区
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
#存储文件
dbfilename dump.rdb
#密码 abcd123
requirepass abcd123
在redis安装目录下,以redis.conf配置文件进行启动
./redis.conf
1、拉取redis镜像
docker pull redis
复制
2、创建挂载目录
mkdir /docker-data/redis
复制
3、下载redis.conf文件
wget http://download.redis.io/redis-stable/redis.conf
复制
4、权限
chmod 777 redis.conf
复制
5、修改默认配置信息
vi /docker-data/redis/redis.conf
bind 127.0.0.1 # 这行要注释掉,解除本地连接限制
protected-mode no # 默认yes,如果设置为yes,则只允许在本机的回环连接,其他机器无法连接。
daemonize no # 默认no 为不守护进程模式,docker部署不需要改为yes,docker run -d本身就是后台启动,不然会冲突
requirepass 123456 # 设置密码
appendonly yes # 持久化
6、docker启动redis
docker run --name redis \
-p 6379:6379 \
-v /docker-data/redis/redis.conf:/etc/redis/redis.conf \
-v /docker-data/redis:/data \
-d redis redis-server /etc/redis/redis.conf --appendonly yes
说明:
-p 6379:6379:端口映射,前面是宿主机,后面是容器。
–name redis:指定该容器名称。
-v 挂载文件或目录:前面是宿主机,后面是容器。
-d redis redis-server /etc/redis/redis.conf:表示后台启动redis,以配置文件启动redis,加载容器内的conf文件。
appendonly yes:开启redis 持久化。
7、检查redis运行状态
docker ps
8、启动
Windows启动Redis
进入Windwos Redis的目录下
cmd启动Redis服务器
Resp连接windowsRedis 不用改ip地址和端口,账户密码都无
然后cmd输入Redis-Cli启动客户端,操作Redis
redis-cli
(1条消息) redis键值出现 \xac\xed\x00\x05t\x00&的解决方法_Abstracted的博客-CSDN博客_\xac
https://blog.csdn.net/qq_16159433/article/details/121491555
(1条消息) redis存中文显示“\xe2\xe5\xb0\x8f\xe5\x87\xa1\x80\x9c\xe2\x80\x9d“解决方案_佐杰的博客-CSDN博客
https://blog.csdn.net/OnlyoneFrist/article/details/109449698
账户和密码是什么
root
ROOT
端口号
远程连接失败咋整
RSP01-去配置文件配置相关的属性
redis/src/redis.conf文件去配,怎么配去网上查
RESP0102-加载配置文件 redis-server 配置文件
,启动redis服务端
RESP02-查询虚拟机的ip地址-ifconfig-账户名 和 redis的密码
daemonize属性改为yes (表明需要在后台运行)
bind 127.0.0.1 这一行给注释掉 (开启redis远程访问服务)
protected-mode 设置成no (允许远程访问)
以前我们启动redis比较麻烦,切换到/usr/loacal/bin/redis 目录下
启动redis-server redis.conf文件
启动redis服务端,现在设置开机后台自动启动
参考文章
涉及文件夹
/etc/init.d
参考文章02
redis-server命令 – 启动Redis服务程序
[root@linuxcool ~]# redis-server /etc/myredis.conf --loglevel verbose
参考博客
官方文档命令
# redis常用命令
# 查所有数据
KEYS *
# 查询以XX开头的数据
KEYS a*
# 删除指定的key
DEL k1 k2 k3
# 批量创建数据
MSET k1 va k2 v2 k3 v3
# 判断一个key是否存在
EXISTS
# 给一个key设置有效期,有效期到期是该key会被自动删除
EXPIRE
# 查看一个key的剩余有效期
TTL
String类型,也就是字符串类型,是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可以分为3类:
常见命令
String的常见命令有:
SET:添加或者修改已经存在的一个String类型的键值对
GET:根据key获取String类型的value
MSET:批量添加多个String类型的键值对
MGET:根据多个key获取多个String类型的value
INCR:让一个整型的key自增1
INCRBY:让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2
INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
SETEX:添加一个String类型的键值对,并且指定有效期
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。特征也与LinkedList类似:
List的常见命令有:
LPUSH key element ... :向列表左侧插入一个或多个元素
LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil
RPUSH key element ... :向列表右侧插入一个或多个元素
RPOP key:移除并返回列表右侧的第一个元素
LRANGE key star end:返回一段角标范围内的所有元素
BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
如何利用List结构模拟一个栈?
入口和出口在同一边
如何利用List结构模拟一个队列?
入口和出口在不同边
如何利用List结构模拟一个阻塞队列?
入口和出口在不同边
出队时采用BLPOP或BRPOP
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
SADD key member ... :向set中添加一个或多个元素
SREM key member ... : 移除set中的指定元素
SCARD key: 返回set中元素的个数
SMEMBERS:获取set中的所有元素
SISMEMBER key member:判断一个元素是否存在于set中
SDIFF key1 key2 ... :求key1与key2的差集
SUNION key1 key2 ..:求key1和key2的并集
127.0.0.1:6379> sadd myset world
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset02 hello
(integer) 1
127.0.0.1:6379> sadd myset02 helloworld
(integer) 1
127.0.0.1:6379> sadd myset02 world
(integer) 1
127.0.0.1:6379> smembers myset02
1) "world"
2) "hello"
3) "helloworld"
127.0.0.1:6379> sinter myset myset02
1) "world"
2) "hello"
127.0.0.1:6379> SDIFF myset02 myset
1) "helloworld"
127.0.0.1:6379> sunion myset myset02
1) "world"
2) "hello"
3) "helloworld"
127.0.0.1:6379>
练习
将下列数据用Redis的Set集合来存储:
张三的好友有:李四、王五、赵六
李四的好友有:王五、麻子、二狗
利用Set的命令实现下列功能:
计算张三的好友有几人
计算张三和李四有哪些共同好友
查询哪些人是张三的好友却不是李四的好友
查询张三和李四的好友总共有哪些人
判断李四是否是张三的好友
判断张三是否是李四的好友
将李四从张三的好友列表中移除
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
SortedSet具备下列特性:
SortedSet的常见命令有:
ZADD key score member:添加一个或多个元素到sorted set ,如果已经存在则更新其score值
ZREM key member:删除sorted set中的一个指定元素
ZSCORE key member : 获取sorted set中的指定元素的score值
ZRANK key member:获取sorted set 中的指定元素的排名
ZCARD key:获取sorted set中的元素个数
ZCOUNT key min max:统计score值在给定范围内的所有元素的个数
ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值
ZRANGE key min max:按照score排序后,获取指定排名范围内的元素
ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素
ZDIFF、ZINTER、ZUNION:求差集、交集、并集
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
127.0.0.1:6379> zadd key1 02 value02
(integer) 1
127.0.0.1:6379> zaddd key1 03 value03
127.0.0.1:6379> zscore key1 value03
"3"
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD
Hash算法
Redis中hash数据结构
Redis中Hash命令的使用
127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
OK
127.0.0.1:6379> HGET runoob field1
"Hello"
127.0.0.1:6379> HGET runoob field2
"World"
127.0.0.1:6379>
常用命令
Hash的常见命令有:
HSET key field value:添加或者修改hash类型key的field的值
HGET key field:获取一个hash类型key的field的值
HMSET:批量添加多个hash类型key的field的值
HMGET:批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有的field和value
HKEYS:获取一个hash类型的key中的所有的field
HVALS:获取一个hash类型的key中的所有的value
HINCRBY:让一个hash类型key的字段值自增并指定步长
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
Jedis的官网地址: https://github.com/redis/jedis,我们先来个快速入门:
引入依赖:
redis.clients
jedis
3.7.0
建立连接
private Jedis jedis;
@BeforeEach
void setUp() {
// 建立连接
jedis = new Jedis("192.168.150.101", 6379);
// 设置密码
jedis.auth("123321");
// 选择库
jedis.select(0);
}
3.测试string
@Test
void testString() {
// 插入数据,方法名称就是redis命令名称,非常简单
String result = jedis.set("name", "张三");
System.out.println("result = " + result);
// 获取数据
String name = jedis.get("name");
System.out.println("name = " + name);
}
4.释放资源
@AfterEach
void tearDown() {
// 释放资源
if (jedis != null) {
jedis.close();
}
}
Jedis使用的基本步骤:
Redis连接池
Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此我们推荐大家使用Jedis连接池代替Jedis的直连方式
public class JedisConnectionFactory {
private static final JedisPool jedisPool;
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接
jedisPoolConfig.setMaxTotal(8);
// 最大空闲连接
jedisPoolConfig.setMaxIdle(8);
// 最小空闲连接
jedisPoolConfig.setMinIdle(0);
// 设置最长等待时间, ms
jedisPoolConfig.setMaxWaitMillis(200);
jedisPool = new JedisPool(jedisPoolConfig, "192.168.150.101", 6379, 1000, "123321");
}
// 获取Jedis对象
public static Jedis getJedis(){
return jedisPool.getResource();
}
}
SpringDataRedis
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:https://spring.io/projects/spring-data-redis
提供了对不同Redis客户端的整合(Lettuce和Jedis)
提供了RedisTemplate统一API来操作Redis
支持Redis的发布订阅模型
支持Redis哨兵和Redis集群
支持基于Lettuce的响应式编程
支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
支持基于Redis的JDKCollection实现
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
配置文件
spring:
redis:
host: 192.168.150.101
port: 6379
password: 123321
lettuce:
pool:
max-active: 8 # 最大连接
max-idle: 8 # 最大空闲连接
min-idle: 0 # 最小空闲连接
max-wait: 100 # 连接等待时间
序列化和自定义序列化方式
我们可以自定义RedisTemplate的序列化方式,代码如下:
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
// 创建Template
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// key和 hashKey采用 string序列化
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// value和 hashValue采用 JSON序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程:
@Autowire
private StringRedisTemplate stringRedisTemplate;
// JSON工
private static final ObjectMapper mapper = new ObjectMapper();
@Test
void testStringTemplate() throws JsonProcessingException {
// 准备
User user = new User("虎哥", 18);
// 手动序列
String json = mapper.writeValueAsString(user);
// 写入一条数据到redis
stringRedisTemplate.opsForValue().set("user:200", json);
// 读取数据
String val = stringRedisTemplate.opsForValue().get("user:200");
// 反序列化 JSON变对象
User user1 = mapper.readValue(val, User.class);
System.out.println("user1 = " + user1);
}
方案一:
何谓缓存穿透,高并发访问,缓存重建业务毕竟复杂的key失效了
解决方法
Day01
导入项目,修改redis和mysql的ip,启动项目 visit this
http://localhost:8081/shop-type/list
http://127.0.0.1:8080
启动nginx在windows平台
多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题。一台tomcat的session共享,session替代方案为数据共享、内存存储、key、value结构
给店铺类型查询业务添加缓存
补充 数据一致性
数据一致性是什么
怎么理解数据一致性
缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
热点key
高并发访问key
缓存失效
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
分类 | ||
---|---|---|
缓存穿透 | ||
缓存击穿 | ||
缓存雪崩 |
需求:定义一个类,实现下面接口,利用Redis实现分布式锁功能。
Feed流分页问题
概念
Redis主从复制配置
redis主从复制
发布订阅02