Redis数据结构存储系统:第一章:安装配置

【Redis入门:从零开始安装配置Redis环境】 Redis跨平台安装与配置指南 本文详细介绍Redis在Windows(推荐WSL)、macOS(Homebrew)和Linux(APT)三大系统的安装方法,涵盖服务启动、基本测试和安全配置。关键步骤包括:连接Redis客户端redis-cli进行数据操作测试,修改redis.conf设置密码和绑定IP等安全措施,以及服务重启验证。文中还提供了常见问题解答,如连接错误处理、卸载方法和局域网访问配置。通过本指南,开发者可快速搭建安全的Redis学习环境,为后续深入使用奠定基础。 阅读详情

一、从NoSQL说起

NoSQL是Not only SQL的缩写,大意为“不只是SQL”,说明这项技术是传统关系型数据库的补充而非替代。在整个NoSQL技术栈中MemCache、Redis、MongoDB被称为NoSQL三剑客。那么时代为什么需要NoSQL数据库呢?我们来做个对比:

 关系型数据库NoSQL数据库
数据存储位置硬盘内存
数据结构高度组织化结构化数据没有预定义的模式
数据操作方式SQL所有数据都是键值对,没有声明性查询语言
事务控制严格的基础事务ACID原则CAP定理

所以NoSQL数据库的最大优势体现为:高性能、高可用性和可伸缩性。

二、Redis简介

Redis英文官网介绍:

Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.

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命令参考文档网址:http://redisdoc.com

三、Redis安装

1.上传redis-4.0.2.tar.gz并解压

tar -zxvf redis-4.0.2.tar.gz

2.安装C语言编译环境

[建议先拍快照]

yum install -y gcc-c++

3.修改安装位置

vim redis解压目录/src/Makefile

PREFIX?=/usr/local/redis

就Redis自身而言是不需要修改的,这里修改的目的是让Redis的运行程序不要和其他文件混杂在一起。

4.编译安装

编译:进入Redis解压目录执行make命令

[建议先拍快照]

安装:make install

5.启动Redis服务器

①默认启动

[root@rich ~]# /usr/local/redis/bin/redis-server
7239:C 07 Oct 18:59:12.144 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
7239:C 07 Oct 18:59:12.144 # Redis version=4.0.2, bits=64, commit=00000000, modified=0, pid=7239, just started
7239:C 07 Oct 18:59:12.144 # Warning: no config file specified, using the default config. In order to specify a config file use /usr/local/redis/bin/redis-server /path/to/redis.conf
7239:M 07 Oct 18:59:12.145 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.2 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 7239
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

7239:M 07 Oct 18:59:12.148 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
7239:M 07 Oct 18:59:12.148 # Server initialized
7239:M 07 Oct 18:59:12.148 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
7239:M 07 Oct 18:59:12.148 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
7239:M 07 Oct 18:59:12.148 * Ready to accept connections
 

停止Redis服务器


/usr/local/redis/bin/redis-cli shutdown
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
7239:M 07 Oct 19:00:53.208 # User requested shutdown...
7239:M 07 Oct 19:00:53.208 * Saving the final RDB snapshot before exiting.
7239:M 07 Oct 19:00:53.214 * DB saved on disk
7239:M 07 Oct 19:00:53.214 # Redis is now ready to exit, bye bye...
 

 

②定制配置项启动

[1]准备配置文件

cp /opt/redis-4.0.2/redis.conf /usr/local/redis/

[2]修改配置项 vim /usr/local/redis/redis.conf

注意:/var/logs目录需要我们提前创建好 mkdir -p /var/logs/redis.log

配置项名称作用取值
daemonize控制是否以守护进程形式运行Redis服务器no
logfile指定日志文件位置"/var/logs/redis.log"
dirRedis工作目录/usr/local/redis

       bind                          绑定的ip地址端口号192.168.0.100                                                   192.168.0.100

[3]让Redis根据指定的配置文件启动

格式
redis-server文件路径 redis.conf文件路径

举例
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
 

 

 

关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案:一般不用设置密码

6.客户端登录

/usr/local/redis/bin/redis-cli

127.0.0.1:6379>

ping

PONG

127.0.0.1:6379> exit

另一种:

cd /usr/local/redis/bin

./redis-cli -h 192.168.0.100 -p 6379

192.168.0.100:6379> ping
PONG

四、Redis五种常用数据结构

1.总体结构

KEYVALUE
string
list
set
hash
zset

Redis中的数据,总体上是键值对,不同数据类型指的是键值对中值的类型。

2.string类型

Redis中最基本的类型,它是key对应的一个单一值。二进制安全,不必担心由于编码等问题导致二进制数据变化。所以redis的string可以包含任何数据,比如jpg图片或者序列化的对象。Redis中一个字符串值的最大容量是512M。

3.list类型

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。说明它的底层是基于链表实现的,所以它操作时头尾效率高,中间效率低。

2.set类型

Redis的set是string类型的无序集合。它是基于哈希表实现的。

3.hash类型

本身就是一个键值对集合。可以当做Java中的Map<String,Object>对待。

4.zset类型

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

五、Redis命令行操作

1.基本操作

①切换数据库

``` html
    Redis默认有16个数据库。
    115 # Set the number of databases. The default database is DB 0, you can select
    116 # a different one on a per-connection basis using SELECT <dbid> where
    117 # dbid is a number between 0 and 'databases'-1
    118 databases 16
    使用select进行切换,数据库索引从0开始
    127.0.0.1:6379> select 2
    OK
    127.0.0.1:6379[2]> select 0
    OK
    127.0.0.1:6379>
```

②查看数据库长度

``` html
    127.0.0.1:6379> dbsize
    (integer) 3
```

2.KEY操作

``` html
●KEYS PATTERN
●TYPE KEY
    返回KEY对应的值的类型
●MOVE KEY DB
    把一组键值对数据移动到另一个数据库中
●DEL KEY [KEY ...]
    根据KEY进行删除,至少要指定一个KEY
●EXISTS KEY
    检查指定的KEY是否存在。指定一个KEY时,存在返回1,不存在返回0。可以指定多个,返回存在的KEY的数量。
●RANDOMKEY
    在现有的KEY中随机返回一个
●RENAME KEY NEWKEY
    重命名一个KEY,NEWKEY不管是否是已经存在的都会执行,如果NEWKEY已经存在则会被覆盖。
●RENAMENX KEY NEWKEY
    只有在NEWKEY不存在时能够执行成功,否则失败
●TIME
    返回当前UNIX时间戳
●TTL KEY
    以秒为单位查看KEY还能存在多长时间
●PTTL KEY
    以毫秒为单位查看KEY还能存在多长时间
●EXPIRE KEY SECONDS
    给一个KEY设置在SECONDS秒后过期,过期会被Redis移除。
●EXPIREAT KEY TIMESTAMP
    设置一个KEY在TIMESTAMP指定的时间过期
●PEXPIRE KEY MILLISECONDS
    以毫秒为单位指定过期时间
●PEXPIREAT KEY MILLISECONDS-TIMESTAMP
    以毫秒为单位指定过期的时间戳
●PERSIST KEY
    移除过期时间,变成永久key
```

2.string操作

``` html
●SET KEY VALUE [EX SECONDS] [PX MILLISECONDS] [NX|XX]
    给KEY设置一个string类型的值。
    EX参数用于设置存活的秒数。
    PX参数用于设置存活的毫秒数。
    NX参数表示当前命令中指定的KEY不存在才行。
    XX参数表示当前命令中指定的KEY存在才行。
●GET KEY
    根据key得到值,只能用于string类型。
●APPEND KEY VALUE
    把指定的value追加到KEY对应的原来的值后面,返回值是追加后字符串长度
●STRLEN KEY
    直接返回字符串长度
●INCR KEY
    自增1
●DECR KEY
    自减1
●INCRBY KEY INCREMENT
    原值+INCREMENT
●DECRBY KEY DECREMENT
    原值-DECREMENT
●GETRANGE KEY START END
    从字符串中取指定的一段
●SETRANGE KEY OFFSET VALUE
    从offset开始使用VALUE进行替换
●SETEX KEY SECONDS VALUE
    设置KEY,VALUE时指定存在秒数
●SETNX KEY VALUE
    新建字符串类型的键值对
●MSET KEY VALUE [KEY VALUE ...]
    一次性设置一组多个键值对
●MGET KEY [KEY ...]
    一次性指定多个KEY,返回它们对应的值,没有值的KEY返回值是(nil)
●MSETNX KEY VALUE [KEY VALUE ...]
    一次性新建多个值
●GETSET KEY VALUE
    设置新值,同时能够将旧值返回

```

 3.list操作

``` html
●LPUSH key value [value ...]
●RPUSH key value [value ...]
●LRANGE key start stop
    根据list集合的索引打印元素数据
    正着数:0,1,2,3,...
    倒着数:-1,-2,-3,...
●LLEN key
●LPOP key
    从左边弹出一个元素。
    弹出=返回+删除。
●RPOP key
    从右边弹出一个元素。
●RPOPLPUSH source destination
    从source中RPOP一个元素,LPUSH到destination中
●LINDEX key index
    根据索引从集合中取值
●LINSERT key BEFORE|AFTER pivot value
    在pivot指定的值前面或后面插入value
●LPUSHX key value
    只能针对存在的list执行LPUSH
●LREM key count value
    根据count指定的数量从key对应的list中删除value
●LSET key index value
    把指定索引位置的元素替换为另一个值
●LTRIM key start stop
    仅保留指定区间的数据,两边的数据被删除

```

4.set操作

``` html
●SADD key member [member ...]
●SMEMBERS key
●SCARD key
    返回集合中元素的数量
●SISMEMBER key member
    检查当前指定member是否是集合中的元素
●SREM key member [member ...]
    从集合中删除元素
●SINTER key [key ...]
    将指定的集合进行“交集”操作
    集合A:a,b,c
    集合B:b,c,d
    交集:b,c
●SINTERSTORE destination key [key ...]
    取交集后存入destination
●SDIFF key [key ...]
    将指定的集合执行“差集”操作
    集合A:a,b,c
    集合B:b,c,d
    A对B执行diff:a
    相当于:A-交集部分
●SDIFFSTORE destination key [key ...]
●SUNION key [key ...]
    将指定的集合执行“并集”操作
    集合A:a,b,c
    集合B:b,c,d
    并集:a,b,c,d
●SUNIONSTORE destination key [key ...]
●SMOVE source destination member
    把member从source移动到destination
●SPOP key [count]
    从集合中随机弹出count个数量的元素,count不指定就弹出1个
●SRANDMEMBER key [count]
    从集合中随机返回count个数量的元素,count不指定就返回1个
●SSCAN key cursor [MATCH pattern] [COUNT count]
    基于游标的遍历

```

5.hash操作

``` html
●HSET key field value
●HGETALL key
●HGET key field
●HLEN key
●HKEYS key
●HVALS key
●HEXISTS key field
●HDEL key field [field ...]
●HINCRBY key field increment
●HMGET key field [field ...]
●HMSET key field value [field value ...]
●HSETNX key field value
●HSCAN key cursor [MATCH pattern] [COUNT count]
```

 6.zset操作

``` html
●ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
●ZRANGE key start stop [WITHSCORES]
●ZCARD key
●ZCOUNT key min max
    根据分数在min,max之间查找元素
●ZSCORE key member
●ZINCRBY key increment member
●ZLEXCOUNT key min max
●ZRANGEBYLEX key min max [LIMIT offset count]
    按照字母顺序在区间内返回member
    min和max使用“[a”表示闭区间,使用“(a”表示开区间
    -表示负无穷
    +表示正无穷
●ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
    在分数的指定区间内返回数据
●ZRANK key member
    先对分数进行升序排序,返回member的排名
●ZREM key member [member ...]
●ZREMRANGEBYLEX key min max
●ZREMRANGEBYRANK key start stop
●ZREMRANGEBYSCORE key min max
●ZREVRANGE key start stop [WITHSCORES]
●ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
●ZREVRANK key member
●ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
●ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
    把指定集合的member取交集,分数会相加
●ZSCAN key cursor [MATCH pattern] [COUNT count]
```

六、Redis持久化机制

官网描述

Redis工作时数据都存储在内存中,万一服务器断电,则所有数据都会丢失。针对这种情况,Redis采用持久化机制来增强数据安全性。

1.RDB

①机制描述

每隔一定的时间把内存中的数据作为一个快照保存到硬盘上的文件中。Redis默认开启RDB机制。

②触发时机

[1]基于默认配置

``` properties
save 900 1
save 300 10
save 60 10000
```

含义

配置含义
save 900 1900秒内至少有一次修改则触发保存操作
save 300 10300秒内至少有10次修改则触发保存操作
save 60 1000060秒内至少有1万次修改则触发保存操作

[2]使用保存命令

save或bgsave

[3]使用flushall命令

这个命令也会产生dump.rdb文件,但里面是空的,没有意义

[4]服务器关闭

如果执行SHUTDOWN命令让Redis正常退出,那么此前Redis就会执行一次持久化保存。

③相关配置

配置项取值作用
save""禁用RDB机制
dbfilename文件名,例如:dump.rdb设置RDB机制下,数据存储文件的文件名
dirRedis工作目录路径指定存放持久化文件的目录的路径。注意:这里指定的必须是目录不能是文件名

④思考

RDB机制能够保证数据的绝对安全吗?

2.AOF

①机制描述

根据配置文件中指定的策略,把生成数据的命令保存到硬盘上的文件中。一个AOF文件的内容可以参照下面的例子:

``` properties
*2
$6
SELECT
$1
0
*3
$3
set
$3
num
$2
10
*2
$4
incr
$3
num
*2
$4
incr
$3
num
*2
$4
incr
$3
num
```

生成上面文件内容的Redis命令是:

``` html
set num 10
incr num
incr num
incr num
```

②AOF基本配置

配置项取值作用
appendonlyyes启用AOF持久化机制
 no禁用AOF持久化机制[默认值]
appendfilename"文件名"AOF持久化文件名
dirRedis工作目录路径指定存放持久化文件的目录的路径。注意:这里指定的必须是目录不能是文件名
appendfsyncalways每一次数据修改后都将执行文件写入操作,缓慢但是最安全。
 everysec每秒执行一次写入操作。折中。
 no由操作系统在适当的时候执行写入操作,最快。

③AOF重写

对比下面两组命令:

AOF重写前AOF重写后
set count 1
incr count
incr count
incr count
set count 4

两组命令执行后对于count来说最终的值是一致的,但是进行AOF重写后省略了中间过程,可以让AOF文件体积更小。而Redis会根据AOF文件的体积来决定是否进行AOF重写。参考的配置项如下:

配置项含义
auto-aof-rewrite-percentage 100文件体积增大100%时执行AOF重写
auto-aof-rewrite-min-size 64mb文件体积增长到64mb时执行AOF重写

实际工作中不要进行频繁的AOF重写,因为CPU资源和硬盘资源二者之间肯定是CPU资源更加宝贵,所以不应该过多耗费CPU性能去节省硬盘空间。

3.持久化文件损坏修复

Redis服务器启动时如果读取了损坏的持久化文件会导致启动失败,此时为了让Redis服务器能够正常启动,需要对损坏的持久化文件进行修复。这里以AOF文件为例介绍修复操作的步骤。

  • 第一步:备份要修复的appendonly.aof文件

  • 第二步:执行修复程序

    /usr/local/redis/bin/redis-check-aof --fix /usr/local/redis/appendonly.aof

  • 第三步:重启Redis

注意:所谓修复持久化文件仅仅是把损坏的部分去掉,而没法把受损的数据找回。

4.扩展阅读:两种持久化机制的取舍

①RDB

[1]优势

适合大规模的数据恢复,速度较快

[2]劣势

会丢失最后一次快照后的所有修改,不能绝对保证数据的高度一致性和完整性。Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑,但上述成立有条件,Linux也有优化手段

②AOF

[1]优势

选择appendfsync always方式运行时理论上能够做到数据完整一致,但此时性能又不好。文件内容具备一定可读性,能够用来分析Redis工作情况。

[2]劣势

持久化相同的数据,文件体积比RDB大,恢复速度比RDB慢。效率在同步写入时低于RDB,不同步写入时与RDB相同。

③RDB和AOF并存

Redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整

RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?作者建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份)、快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

④使用建议

如果Redis仅仅作为缓存可以不使用任何持久化方式。

其他应用方式综合考虑性能和完整性、一致性要求。

RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。如果不开启AOF,仅靠Master-Slave Replication 实现高可用性能也不错。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。新浪微博就选用了这种架构。

七、Redis事务控制

1.Redis事务控制的相关命令

命令名作用
MULTI表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中。
EXEC执行MULTI后面命令队列中的所有命令。
DISCARD放弃执行队列中的命令。
WATCH“观察“、”监控“一个KEY,在当前队列外的其他命令操作这个KEY时,放弃执行自己队列的命令
UNWATCH放弃监控一个KEY

2.命令队列执行失败的两种情况

①加入队列时失败

``` html
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr age www
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
```

遇到了入队时即可检测到的错误,整个队列都不会执行。

②执行队列时失败

``` html
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 30
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> incrby age ww
QUEUED
127.0.0.1:6379> incrby age 5
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 35
3) (integer) 40
4) (error) ERR value is not an integer or out of range
5) (integer) 45
127.0.0.1:6379> get age
"45"
```

错误在入队时检测不出来,整个队列执行时有错的命令执行失败,但是其他命令并没有回滚。

③Redis为什么不支持回滚

官方解释如下:

如果你有使用关系式数据库的经验, 那么 “Redis 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。以下是这种做法的优点: 1.Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。 2.因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。 有种观点认为 Redis 处理事务的做法会产生 bug , 然而需要注意的是, 在通常情况下, 回滚并不能解决编程错误带来的问题。 举个例子, 如果你本来想通过 INCR 命令将键的值加上 1 , 却不小心加上了 2 , 又或者对错误类型的键执行了 INCR , 回滚是没有办法处理这些情况的。

3.悲观锁和乐观锁

在使用WATCH命令监控一个KEY后,当前队列中的命令会由于外部命令的执行而放弃,这是乐观锁的体现。

  • 悲观锁

    认为当前环境非常容易发生碰撞,所以执行操作前需要把数据锁定,操作完成后释放锁,其他操作才可以继续操作。

  • 乐观锁

    认为当前环境不容易发生碰撞,所以执行操作前不锁定数据,万一碰撞真的发生了,那么放弃自己的操作。

八、Redis主从复制机制

1.读写分离的好处:

  • 性能优化:主服务器专注于写操作,可以用更适合写入数据的模式工作;同样,从服务器专注于读操作,可以用更适合读取数据的模式工作。
  • 强化数据安全,避免单点故障:由于数据同步机制的存在,各个服务器之间数据保持一致,所以其中某个服务器宕机不会导致数据丢失或无法访问。从这个角度说参与主从复制的Redis服务器构成了一个集群。

2.搭建步骤

①思路

Redis集群在运行时使用的是同一个可执行文件,只是对应的配置文件不同。

每个配置文件中相同的参数是:

``` html
dir /usr/local/cluster-redis
```

不同的参数有:

配置项名称作用取值
portRedis服务器启动后监听的端口号6000
7000
8000
dbfilenameRDB文件存储位置dump6000.rdb
dump7000.rdb
dump8000.rdb
logfile日志文件位置/var/logs/redis6000.log
/var/logs/redis7000.log
/var/logs/redis8000.log
pidfilepid文件位置/var/run/redis6000.pid
/var/run/redis7000.pid
/var/run/redis8000.pid

②步骤

  • 第一步:创建/usr/local/cluster-redis目录

  • 第二步:把原始未经修改的redis.conf复制到/usr/local/cluster-redis目录

  • 第三步:把/usr/local/cluster-redis目录下的redis.conf复制为redis6000.conf

  • 第四步:按照既定计划修改redis6000.conf中的相关配置项

    • dir
    • port
    • dbfilename
    • logfile
    • pidfile
  • 第五步:复制redis6000.conf为redis7000.conf

  • 第六步:修改redis7000.conf中的相关配置项

    • port
    • dbfilename
    • logfile
    • pidfile
  • 第七步:复制redis6000.conf为redis8000.conf

  • 第八步:修改redis8000.conf中的相关配置项

    • port
    • dbfilename
    • logfile
    • pidfile

③启动Redis主从复制集群

```html
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis6000.conf
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis7000.conf
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis8000.conf
```

使用redis-cli停止指定服务器的命令格式如下:
/usr/local/bin/redis-cli -h IP地址 -p 端口号 shutdown

3.主从关系

①查看主从关系

``` html
127.0.0.1:6000> info replication
# Replication
role:master
connected_slaves:0
```

刚刚启动的集群服务器中每一个节点服务器都认为自己是主服务器。需要建立主从关系。

②设定主从关系

在从机上指定主机位置即可

``` html
SLAVEOF 127.0.0.1 6000
```

③取消主从关系

在从机上执行命令

``` html
SLAVEOF NO ONE
```

4.初步测试

  • 测试1:在主机写入数据,在从机查看
  • 测试2:在从机写入数据报错。配置文件中的依据是:slave-read-only yes
  • 测试3:主机执行SHUTDOWN看从机状态
  • 测试4:主机恢复启动,看从机状态
  • 测试5:从机SHUTDOWN,此时主机写入数据,从机恢复启动查看状态。重新设定主从关系后看新写入的数据是否同步。

5.哨兵模式

①作用

通过哨兵服务器监控master/slave实现主从复制集群的自动管理。

②相关概念

[1]主观下线

1台哨兵检测到某节点服务器下线。

[2]客观下线

认为某个节点服务器下线的哨兵服务器达到指定数量。这个数量后面在哨兵的启动配置文件中指定。

③配置方式

简单起见我们只配置一台哨兵。我们所需要做的就是创建一个哨兵服务器运行所需要的配置文件。

vim /usr/local/cluster-redis/sentinel.conf

格式sentinel monitor 为主机命名 主机IP 主机端口号 将主机判定为下线时需要Sentinel同意的数量
例子sentinel monitor mymaster 127.0.0.1 6000 1

④启动哨兵

/usr/local/redis/bin/redis-server /usr/local/cluster-redis/sentinel.conf --sentinel

``` html
+sdown master mymaster 127.0.0.1 6379 【主观下线】
+odown master mymaster 127.0.0.1 6379 #quorum 1/1【客观下线】
……
+vote-for-leader 17818eb9240c8a625d2c8a13ae9d99ae3a70f9d2 1【选举leader】
……
+failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379【把一个从机设置为主机】

-------------挂掉的主机又重新启动---------------------
-sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381【离开主观下线状态】
+convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381【转换为从机】
```

 

九、发布订阅

1.订阅一个频道

``` html
127.0.0.1:6379> SUBSCRIBE cctv
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv"
3) (integer) 1

```

2.在一个频道上发布信息

```html
127.0.0.1:6379> PUBLISH cctv hai
(integer) 1
```

 

```html
127.0.0.1:6379> SUBSCRIBE cctv
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "cctv"
3) (integer) 1
1) "message"
2) "cctv"
3) "hai"
```

 

十、Jedis

1.一个对比

 MySQLRedis
连接ConnectionJedis
连接池C3P0等等JedisPool
操作完成关闭连接关闭连接

2.Redis准备

在Redis配置文件中关闭bind配置,设置密码。

``` html
#bind 127.0.0.1
requirepass 你的密码
```

## 3.Jedis

```xml
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
    </dependency>
```

 

``` java
//指定Redis服务器的IP地址和端口号
Jedis jedis = new Jedis("192.168.70.138", 6379);

//设置密码
jedis.auth("123456");

//执行ping命令
String ping = jedis.ping();

System.out.println(ping);

jedis.close();

```

## 4.JedisPool

```java
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();

String host = "192.168.70.138";

int port = Protocol.DEFAULT_PORT;

int timeout = Protocol.DEFAULT_TIMEOUT;

String password = "123456";

JedisPool jedisPool = new JedisPool(poolConfig, host, port, timeout, password);

Jedis jedis = jedisPool.getResource();

String ping = jedis.ping();

System.out.println(ping);

jedisPool.close();
```

 

Redis高性能键值存储系统安装与配置教程 Redis是一个开源的高性能键值存储数据库,由意大利程序员Salvatore Sanfilippo(别名antirez)创建,旨在通过提供持久化选项,来弥补传统内存存储的不足。它以其出色的读写性能、灵活的数据结构以及丰富的高级功能,赢得了全球开发者的青睐。Redis广泛应用于高性能的键值缓存服务,同时,它也是构建复杂系统时不可或缺的组件,比如消息队列、分布式锁、实时分析等。Redis 3.0.500版本引入了多个新的命令,这些命令旨在扩展Redis的现有功能和性能。 阅读详情

相关推荐

jedis-3.0.0源码

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。这是jedis-3.0.0源码,支持集群和管道,希望大家喜欢。

④Redis服务,主从配置 、sentinel---哨兵模式、全网最细讲解

文章目录Redis主从配置主从简介**1、主从 – 用法**部署三台机器Redis---主从同步修改slave1的配置文件:修改slave2的配置文件测试主从Redis-sentinel---哨兵模式配置哨兵模式每台机器启动哨兵服务: Redis主从配置 主从简介 1、主从 – 用法 像MySQL一样,redis是支持主从同步的,而且也支持一主多从以及多级从结构。 主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的操作就可以由从服务器来承担。 redis的主从同步是异步进行的,这意味着主

mingqing的博客 471

jedis 2.9 jar包括源代码及common-pool

jedis 2.9jar包括源代码及common-pool 下面是官方地址,不用积分: https://github.com/xetorthio/jedis http://mvnrepository.com/artifact/redis.clients/jedis/2.9.0

Redis的Java客户端——Jedis

到现在的小伙伴可能在想,那我们最后执行close方法的时候,不还是销毁了吗? 答案:不是销毁了 我们看一下close的原码文件,当判断我们又连接池的时候就是进入到第一个if,底层并不会真正的close,而是归还return出去了

weixin_51351637的博客 1131

Redis:Redis代码

Redis真的那么好用吗? 一、Redis是什么? Redis是一个开源的底层使用C语言编写的key-value存储数据库。可用于缓存、事件发布订阅、高速队列等场景。而且支持丰富的数据类型:string(字符串)、hash(哈希)、list(列表)、set(无序集合)、zset(sorted set:有序集合) Redis和Memcached类似,为保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从) 同步。 二、Redis在项目中的应用场景 1、缓存数据 对于最常用的数据,经常要查询并且变动不是很频繁的数据: 需要高频次访问 持久化数据访问较慢、 用key查询 2、消息队列 相当于消息订阅系统,比如ActiveMQ、RocketMQ。如果对数据有较高一致性要求时,还是建议使用

jedis源码 (学习jedis)

jedis源码 (学习jedis必备,附带测试用例)

Redis使用守护进程启动sentinel并指定其日志目录

Redis使用守护进程启动sentinel并指定其日志目录 2016-08-16 09:11 2728人阅读 评论(0) 收藏 举报 分类: http://blog.youkuaiyun.com/xuxile/article/details/52216923 redis(9) 正常Redis-server可以通过配置文件来指定守护进程启动以及指定日志

mmbbz的专栏 1641

CMAC算法原理

2、K1 通过以下运算导出:若 L 的最高有效位等于 0,则 K1 是 L 的左移 1 位。3、K2 通过如下运算导出:若 K1 的最高有效位等于 0,则 K2 是 K1 的左移 1 位。采用了 AES 算法中的类似 CBC 模式的加密方式,即对前一个分组的密文与当前分组的明文进行异或操作后在加密,2、分块处理:首先将消息分成多个固定长度的块,若消息长度不是块大小的倍数,则可以使用填充来将其填充到合适的大小。1、子密钥计算,通过主密钥生成子密钥(key1,key2),子密钥用于最后一个块处理;

sky的博客 1659

菜鸟的redis入门之路1--连接redis客户端报错

CentOS6.5下安装了redis,想连接redis客户端查看redis的数据列表,输入命令:redis-cli,直接报错如下: [root@xxxx]# redis-cli   Could not connect to Redis at 127.0.0.1:6379: Connection refused not connected&gt; 查了很多资料,各种百度,都没有相关问题的解决方案...

qq_32312323的博客 490

数据科学常见模型总结(二)-倾向性得分匹配模型

PSM的核心思想是从未受干预的用户群体中,找到和干预对象一模一样的用户,这样就可以把因果效应归因到干预上。

wudelong0112的专栏 4898

ROS2前置基础教程 | 小鱼教你用CMake依赖查找流程

上面我们用g++、make、cmake三种方式来编译ros2的C++节点。用cmake虽然成功了,但是CMakeLists.txt的内容依然非常的臃肿,我们需要将其进一步的简化。将上面的CmakLists.txt改成下面的样子 接着继续生成和编译 是不是非常的神奇,为什么可以浓缩成那么短的几句指令呢?find_package查找路径对应的环境变量如下。 打开终端,输入指令: 结果 观察PATH变量,你会发现赫然在其中,中的路径如果以或结尾,则自动回退到上一级目录,接着检查这些目录下的 cmake找到这些目录

生活不止眼前的苟且 7163

Redis 中的 standalone(单机模式)配置说明和分析

这里写目录标题14.2 standalone配置说明和分析14.2.1 总体配置14.2.2 最大内存及策略14.2.3 AOF相关配置14.2.4 RDB相关配置14.2.5 慢查询配置14.2.6 数据结构优化配置14.2.7 复制相关配置14.2.8 客户端相关配置14.2.9 安全相关配置参考目录 14.2 standalone配置说明和分析        相对于很多大型存储系统,Redis的配置不是很多,到了Redis3.0之后

norang的博客 3086

Nginx健康检查实战:如何用第三方模块提升服务可用性(附详细配置)

本文深入探讨了如何通过集成第三方健康检查模块来提升Nginx的服务可用性。文章对比了Nginx默认被动检查的局限性,并详细介绍了主动健康检查的核心优势、主流模块选型,以及以nginx_upstream_check_module为例的实战部署与配置指南,帮助运维人员构建更可靠的负载均衡架构。

weixin_28331555的博客 308

Redis数据结构存储系统:第一章:安装配置,java开发岗位面试题总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!成功只会留给那些有准备的人!

m0_60575487的博客 709

[MR]RCM约束下的手术机器人

RCM(Remote Center of Motion)约束,通俗讲就是做微创手术时,机械臂插进身体,机械臂受身体的插入点的约束,不能乱动。 相关参考论文 Task Control with Remote Center of Motion Constraint for Minimally Invasive Robotic Surgery ...

土豆大叔的博客 4582

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 976

Redis-概念、安装、基本配置

分布式系统是由多个独立的计算机组成的系统,这些计算机通过网络协同工作,给用户呈现一个统一的整体。分布性:系统的处理单元分布在不同的物理位置。自治性:每个节点可以独立进行数据处理和资源管理。并行性:任务可以分解成多个子任务并行处理。全局性:存在全局的进程通信机制和保护机制。分布式缓存是指在分布式环境下,将一些热门数据存储到离用户或应用更近的位置,以减少远程数据传输的延迟。Redis可以通过主从复制和分片来实现分布式缓存。

sq2048935747@163.com的博客 3085

2026.3.9:具身智能之GraspNet:Ubuntu24.04安装GraspNet

本文详细介绍了在Ubuntu24.04系统下安装GraspNet具身智能框架的全过程。主要包括:1) 创建Python3.9虚拟环境;2) 安装CUDA12.8和PyTorch2.7.0等基础依赖;3) 编译安装pointnet2、knn和graspnetAPI三个核心组件;4) 修改源码适配新版PyTorch;5) 下载预训练权重并成功运行demo。安装过程中特别提示了可能遇到的报错处理方案,最终在GPU环境下实现了GraspNet的部署运行。整个流程涵盖了从环境配置到项目运行的完整步骤,为具身智能研究者

拥抱具身智能,昇腾Ascend C 207

如何在 Ubuntu 上安装和配置 Redis

Redis是一个开源的(BSD许可),内存中的数据结构存储系统,用作数据库、缓存和消息代理。它支持字符串、哈希、列表、集合、有序集合(带范围查询)、位图、超日志、地理空间索引(带半径查询)和流等多种数据结构。Redis设计用于在受信任的环境中由受信任的客户端使用,本身没有强大的安全特性。然而,Redis提供了一些基本的安全特性,如基本的未加密密码、命令重命名和禁用。接下来,我将一步一步教大家如何在 Ubuntu 中进行安装和部署!!

weixin_53510183的博客 1570

3、基于视觉的智能分拣机:原理、算法与应用

本文介绍了一种基于视觉的智能分拣系统,利用树莓派、相机模块和多种检测算法实现低成本、高精度的物体分拣。系统支持颜色、形状和尺寸三种检测方式,准确率达99%,广泛适用于制造业、农业和物流等领域。文章详细阐述了各检测算法原理、测试结果及系统优化方向,并探讨了其实际应用案例与未来发展前景。

mqtt6iot的博客 239

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

redis安装与配置

Redis是一个开源的基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),具有高性能、持久化、复制、集群等特性,被广泛应用于构建高性能、可扩展的Web应用和分布式系统中。Redis的设计简单而灵活,易于部署和使用,是一种强大的数据存储解决方案。

weixin_67363416的博客 1300

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Redis安装与配置及常用命令使用讲解

Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合,这使得它非常灵活和多用途。Redis的主要作用是提供高性能的数据存储和访问。由于数据存储在内存中,Redis能够实现非常快速的读写操作,使其成为处理高并发和低延迟应用的理想选择。此外,Redis还具有以下几个重要的特性和应用场景:缓存:Redis常用于缓存热门数据,以减轻后端数据库的负载。

让优秀成为一种习惯! 1270

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 版本控制SVN和Git
下一篇: JavaSE:第十七章:编程测试题
Java程序员廖志伟
Java程序员廖志伟 优质创作者: Java技术领域 优质创作者: Java技术领域 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄8年 2万+粉丝 1902原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java程序员廖志伟

赏我包辣条呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值