Redis学习笔记

本文详细介绍了Redis的环境搭建步骤,包括下载、安装、配置及性能测试工具redis-benchmark的应用。此外,涵盖了常用命令、数据类型、事务处理、SpringBoot整合、持久化策略和主从复制等内容,是Redis初学者的实用参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境搭建

1、下载

官网下载redis
在这里插入图片描述

2、安装

  1. Redis运行环境安装(Redis基于C++)
yum install gcc-c++
  1. 解压
  2. 安装Redis,进入Redis解压目录下执行
make
# 然后执行
make install
  1. 从Redis解压目录下复制配置文件redis.conf到安装目录下/usr/local/bin

  2. 修改配置文件
    redis默认不是后台启动的,daemonize改为yes
    redis默认不是后台启动的,daemonize改为yes
    打开远程连接,注释掉bind
    打开远程连接,注释掉bind

  3. 启动Redis
    在安装目录/usr/local/bin下执行

redis-server redis.conf

即通过redis.conf配置文件来启动Redis

  1. 使用redis-cli连接指定的端口号测试,Redis的默认端口6379
redis-cli -p 6379
  1. 查看redis进程是否开启
  2. 关闭Redis服务
shutdown
  1. 断开连接
exit
  1. 开放端口号
firewall-cmd --zone=public --add-port=6379/tcp --permanent
  1. 重启防火墙
systemctl restart firewalld.service

二、性能测试

redis-benchmark:Redis官方提供的性能测试工具,参数选项如下:
在这里插入图片描述
例如:测试:100个并发连接 100000请求

redis-benchmark -h localhost -p 6379 -c 100 -n 100000

在这里插入图片描述

三、常用命令

可以通过官网查看。

四、数据类型

Redis有八大数据类型

  1. String

  2. List(列表)
    Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

  3. Set(集合)
    Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

  4. Hash(哈希)
    Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

  5. Zset(有序集合)
    不同的是每个元素都会关联一个double类型的分数(score)。redis正是通过分数来为集合中的成员进行从小到大的排序。
    score相同:按字典顺序排序。
    有序集合的成员是唯一的,但分数(score)却可以重复。

  6. Geospatial(地理位置)
    使用经纬度定位地理坐标并用一个有序集合zset保存,所以zset命令也可以使用。
    有效的经度从-180度到180度。
    有效的纬度从-85.05112878度到85.05112878度。
    指定单位的参数 unit 必须是m(米)、km(千米)、mi(英里)、ft(英尺)。

  7. Hyperloglog(基数统计)。
    Redis HyperLogLog 是用来做基数(数据集中不重复的元素的个数)统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
    花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。
    因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
    其底层使用string数据类型
    应用场景(需要允许容错):访问量(UV):一个用户多次访问,也只能算作一个人

  8. BitMaps(位图)
    使用位存储,信息状态只有 0 和 1
    Bitmap是一串连续的2进制数字(0或1),每一位所在的位置为偏移(offset),在bitmap上可执行AND,OR,XOR,NOT以及其它位操作。
    应用场景:签到统计、状态统计……

五、事务

Redis的单条命令是保证原子性的,但是redis事务不能保证原子性,也没有隔离性。

1、Redis事务操作过程:

  1. 开启事务(multi)
  2. 命令入队
  3. 执行事务(exec)/ 取消事务(discurd)

事务中的命令在加入时都没有被执行,直到提交时才会开始执行(Exec)一次性完成。

27.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379> set k1 v1 # 命令入队
QUEUED
127.0.0.1:6379> set k2 v2 # ..
QUEUED
127.0.0.1:6379> get k1
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> keys *
QUEUED
127.0.0.1:6379> exec # 事务执行
1) OK
2) OK
3) "v1"
4) OK
5) 1) "k3"
   2) "k2"
   3) "k1"
  • List item

2、事务错误:

  • 代码语法错误(编译时异常)所有的命令都不执行
  • 代码逻辑错误 (运行时异常) 其他命令可以正常执行 >>> 所以不保证事务原子性

3、监控

可以使用watch key监控指定数据,相当于乐观锁加锁。在多线程情况下监控数据是否有被其他线程修改。

注:每次提交执行exec后都会自动释放锁,不管是否成功

六、与spring boot整合

  1. 引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置文件添加配置
spring:
  redis:
    host: 192.1168.10.128
    port: 6379
  1. 定制RedisTemplate的模板
@Configuration
public class RedisConfig {

   @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        // 将template 泛型设置为 <String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate();
        // 连接工厂,不必修改
        template.setConnectionFactory(redisConnectionFactory);
        /*
         * 序列化设置
         */
        // key、hash的key 采用 String序列化方式
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // value、hash的value 采用 Jackson 序列化方式
        template.setValueSerializer(RedisSerializer.json());
        template.setHashValueSerializer(RedisSerializer.json());
        template.afterPropertiesSet();
        
        return template;
    }
}
  1. 测试
@SpringBootTest
class Redis02SpringbootApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {

        // redisTemplate 操作不同的数据类型,api和我们的指令是一样的
        // opsForValue 操作字符串 类似String
        // opsForList 操作List 类似List
        // opsForHah

        // 获取连接对象
        //RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
        //connection.flushDb();
        //connection.flushAll();

        redisTemplate.opsForValue().set("mykey","kuangshen");
        System.out.println(redisTemplate.opsForValue().get("mykey"));
    }
}

七、redis.conf

  1. 容量单位不区分大小写,G和GB有区别
    在这里插入图片描述

  2. 可以使用 include 组合多个配置问题
    在这里插入图片描述

  3. 网络配置
    在这里插入图片描述

  4. 日志输出级别
    在这里插入图片描述

  5. 日志输出文件
    在这里插入图片描述

  6. 持久化规则
    RDB与AOF

  7. RDB文件相关
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  8. 主从复制
    在这里插入图片描述

  9. Security模块中进行密码设置
    在这里插入图片描述

  10. 客户端连接相关
    最大客户端数量
    在这里插入图片描述
    最大内存限制
    在这里插入图片描述
    内存达到限制值的处理策略
    在这里插入图片描述
    处理策略一共有6种
    volatile-lru:只对设置了过期时间的key进行LRU
    allkeys-lru:删除lru算法的key
    volatile-random:随机删除即将过期key
    allkeys-random:随机删除
    volatile-ttl:删除即将过期的
    noeviction:永不过期,返回错误

  11. AOF相关部分
    在这里插入图片描述
    在这里插入图片描述

八、持久化

1、RDB

在指定时间间隔后,将内存中的数据集快照写入数据库 ;在恢复时候,直接读取快照文件,进行数据的恢复 ;
在这里插入图片描述
上图种配置的意思是在60s内操作达到10000次,或者300s内操作达到10次,或者在900s内操作达到1次,就将触发持久化。执行flushall、save命令,退出redis也会触发持久化。

默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。文件名可以在配置文件中进行自定义。

2、AOF

快照功能(RDB)并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、以及未保存到快照中的那些数据。 从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。

如果要使用AOF,需要修改配置文件:
在这里插入图片描述
修复.aof文件

redis-check-aof --fix

九、发布-订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
命令查看官方文档
在这里插入图片描述

十、Redis主从复制

1、配置

为从机配置主机

SLAVEOF host port  # 主机IP和port

从配置文件配置(永久)
在这里插入图片描述

2、哨兵模式

配置文件 sentinel.conf

# Example sentinel.conf
 
# 哨兵sentinel实例运行的端口 默认26379
port 26379
 
# 哨兵sentinel的工作目录
dir /tmp
 
# 哨兵sentinel监控的redis主节点的 ip port 
# master-name  可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 1
 
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
 
 
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
 
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
 
 
 
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面: 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。  
#4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
 
# SCRIPTS EXECUTION
 
#配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。
 
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
#这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
#一个是事件的类型,
#一个是事件的描述。
#如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
#通知脚本
# sentinel notification-script <master-name> <script-path>
  sentinel notification-script mymaster /var/redis/notify.sh
 
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。 
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的,能被多次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值