-->
侧边栏壁纸
博主头像
断钩鱼 博主等级

行动起来,活在当下

  • 累计撰写 28 篇文章
  • 累计创建 34 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Redis

halt
2020-01-13 / 0 评论 / 5 点赞 / 2023 阅读 / 0 字

一、Redis 介绍

介绍

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

常用命令

  • 启动
redis-server ./redis.conf 
  • 进入客户端
redis-cli -p 6379
  • 关闭
redis-cli -p 6379 shutdown
  • String 类型操作
    在这里插入图片描述
  • Hash 类型操作
    在这里插入图片描述
  • List 类型操作
    在这里插入图片描述
  • 事务
    在这里插入图片描述
    如果是6379默认端口可省略 -p 6379

二、Redis安装、使用(Centos 7)

在VMware虚拟机中安装以及测试

安装Centos 7

Centos官方站点: http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64/
阿里云站点:http://mirrors.aliyun.com/centos/7/isos/x86_64/

VMware 安装运行

创建新虚拟机导入镜像即可

安装常用插件

yum -y install vim # 安装vim编辑器
yum -y install wget # 用来下载网络资源
yum -y install gcc # 编译redis (c、c++ 等语言的编译器)
yum -y install lrzsz # 拖拽上传插件

配置为静态IP(方便连接测试等)

如过没有安装 vim 用 vi 命令 ens33 是设备名

vim /etc/sysconfig/network-scripts/ifcfg-ens33

添加:

ONBOOT=yes #开机启用网卡
BOOTPROTO=static # 使用静态Ip
IPADDR=192.168.22.100  #需要和设置VMware虚拟网卡的IP段统一
NETMASK=255.255.255.0
GATEWAY=192.168.22.2  #需要和VMware虚拟网卡设置的网关一致
DNS1=8.8.8.8    #这个必须设置  否则会导致能ping通外部IP,ping不通域名

重启 network 网络服务

service network restart 

  • 云实例可以跳过以上步骤

编译安装Redis

cd redis/ # 进入redis目录
make # 编译redis
make install # 安装redis

如果 make 时报错: zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
使用:

make MALLOC=libc 

测试是否安装完成

cd redis/ # 进入redis目录
redis-server # 启动服务

结果:
启动测试

Redis分片

通过分片可以提高redis的容量

修改redis配置文件

cd redis/
vim redis.conf
  • 取消IP绑定 也可以设置为指定IP为了方便我直接注释掉 大约在第69行
    不取消绑定的话只能指定ip访问
    编辑配置文件
  • 关闭保护模式
    不关闭需要需要设置 密码 配置文件第507行 取消注释设置密码requirepass password
    关闭保护模式
  • 设置后台运行
    设置后台运行
  • 将虚拟机克隆三份 并运行
cd redis
redis-server ./redis.conf # 运行并指定配置文件

测试分片

关闭防火墙:

systemctl stop firewalld.service            #停止firewall
systemctl disable firewalld.service        #禁止firewall开机启动

添加依赖:

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </dependency>

添加测试代码和数据:

    @Test
    public void testOne(){
        //存放redis各个分片连接信息
        List<JedisShardInfo> shardInfos = new ArrayList<>();
        //存入连接数据
        shardInfos.add(new JedisShardInfo("192.168.22.101",6379));
        shardInfos.add(new JedisShardInfo("192.168.22.102",6379));
        shardInfos.add(new JedisShardInfo("192.168.22.103",6379));
        //创建分片连接
        ShardedJedis shardedJedis = new ShardedJedis(shardInfos);
        //存入数据
        shardedJedis.set("test1","hello redis");
        shardedJedis.set("test2","hello redis");
        shardedJedis.set("test3","hello redis");
    }

进入redis客户端,查看数据是否为分散分布 例如:

[root@localhost redis-5.0.7]# redis-cli
127.0.0.1:6379> get test1
(nil)
127.0.0.1:6379> get test2
"hello redis"
127.0.0.1:6379> get test3
(nil)
127.0.0.1:6379> 

Redis哨兵实现高可用

Redis 分片实现了redis存储的扩容 但是一旦一台机器宕机数据就会丢失,从而导致数据不完整 从机会同步主机的数据 哨兵可以在主机宕机后进行新主机的选举

  • 将三台主机进行主从挂载一台主机两台从机
  1. 在redis客户端中进行主从的挂载
# 1.进入redis客户端
redis-cli -p 6379 # 默认端口可省略
# 2.查看redis主从状态
INFO replication
# 3.不出意外都是主机 进行主从挂载 将102、103两台机器作为从机 101 作为主机
# 分别在两台从机客户端执行以下命令
# SLAVEOF 主机ip地址 主机port端口
SLAVEOF 192.168.22.101 6379

# 4.挂载完毕后查看机器状态 slave从机 master主机
INFO replication 
  1. 搭建哨兵
  • 复制一个虚拟机出来作为redis哨兵
  • 修改哨兵配置文件 sentinel.conf
    关闭保护模式、开启后台运行、指定哨兵监控的主机名和地址以及选举条件
    关闭保护模式、开启后台运行
    指定哨兵监控的主机名和地址以及选举条件

测试哨兵

    @Test
    public void testTwo(){
        //用来存放哨兵信息
        Set<String> set = new HashSet<>();
        //存入哨兵的连接信息
        set.add("192.168.22.104:26379");
        //创建哨兵连接池 mymaster 为配置文件中的主机名
        JedisSentinelPool sentinels = new JedisSentinelPool("mymaster", set);
        //取一条连接
        Jedis resource = sentinels.getResource();
        //进行存数据
        resource.set("a","1324568");
    }

查看主从机中是否有数据、数据是否一致

Redis集群

集群目的:实现扩容和高可用
搭建集群条件:

  1. 最少三台
  2. 主机数量最好为奇数 因为集群存活条件为存活的服务器数量>总数量二分之一

本次集群为 3主 3从 一台主机配备一台从机

修改配置文件

  1. 取消ip绑定
    编辑配置文件
  2. 关闭保护模式
    关闭保护模式
  3. 修改配置文件路径
    修改路径
  4. 启用内存优化策略 volatile-lru
    LRU 算法
  5. 关闭AOF持久化模式
    关闭AOF
  6. 开启集群配置
    集群配置
    配置为按业务需要配置,并不固定,上面只是例子 可以参考:https://www.jianshu.com/p/41f393f594e8

将所有Redis节点启动

cd redis/
redis-server ./redis.conf

创建Redis集群

redis-cli --cluster create --cluster-replicas 从机数量 服务器地址(多个空格隔开)

redis-cli --cluster create --cluster-replicas 1 192.168.22.200:6379 192.168.22.201:6379 192.168.22.202:6379 192.168.22.210:6379 192.168.22.211:6379 192.168.22.212:6379

Redis测试

    @Test
    public void testThree(){
        Set<HostAndPort> set = new HashSet<>();
        set.add(new HostAndPort("192.168.22.200",6379));
        set.add(new HostAndPort("192.168.22.201",6379));
        set.add(new HostAndPort("192.168.22.202",6379));
        set.add(new HostAndPort("192.168.22.210",6379));
        set.add(new HostAndPort("192.168.22.211",6379));
        set.add(new HostAndPort("192.168.22.212",6379));

        JedisCluster jedisCluster = new JedisCluster(set);
        jedisCluster.set("a","a");
        jedisCluster.set("b","b");
        jedisCluster.set("c","c");
        jedisCluster.set("d","d");
    }

可以将代码提取为配置类交给spring管理 地址和端口可以写在配置文件内 通过字符串切割获取 提高程序灵活性

Redis 的持久化策略

1、RDB方式
RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是Redis默认采用的持久化方式,在配置文件中已经预置了3个条件:
save 900 1
save 300 10
save 60 10000

save参数指定了快照条件,可以存在多个条件,条件之间是“或”的关系。如上所说,save900 1的意思是在15分钟(900秒钟)内有至少一个键被更改则进行快照。如果想要禁用自动快照,只需要将所有的save参数删除即可。
Redis默认会将快照文件存储在当前目录的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。

2、AOF方式
默认情况下Redis没有开启AOF(append only file)方式的持久化,可以通过appendonly参数开启:
开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof

详细参考:https://juejin.im/entry/58ccb34a0ce4630057c9aa84

Redis 内存优化策略

  1. volatile-lru 在设定超时时间的数据中使用LRU算法删除数据
  2. allkeys-lru 所有数据都采用LRU算法删除.
  3. volatile-lfu 设定超时时间的数据中采用LFU算法(4.x 新增)
  4. allkeys-lfu 所以数据采用LFU(4.x 新增)
  5. volatile-random 设定超时时间的数据随机删除
  6. allkeys-random 所有数据随机删除
  7. volatile-ttl 根据剩余时间多少删除数据(先删除少的)
  8. noeviction(默认策略) 不会自动删除数据.内存溢出时报错返回
5
博主关闭了所有页面的评论