学习尚硅谷的Redis学习时所做的笔记
使用Redis可以建立性能非常出色的缓存服务器,查询请求先在Redis中查找所需要的数据,如果能够查询到(命中)则直接返回,大大减轻关系型数据库的压力。
使用token(令牌)作为用户登录系统时的身份标识,这个token就可以在Redis中临时存储。
Spring提供了一种技术解决分布式环境下Session不一致问题,叫SpringSession。而Redis就可以为SpringSession提供一个数据存储空间。
在Redis中有一种数据类型是set,和Java中的Set集合很像,不允许存储重复数据。借助这个特性我们可以在Redis中使用set类型存储流式数据达到去重的目的。
Redis是一个严格的Key-value数据库,所有数据都必须通过key去找到value,Redis没有提供直接根据查询条件匹配value的方法。
Redis中一个key对应一个value,没有多个key对应同一个value的情况。
Redis不支持回滚。如果一个命令在加入队列时没有检测出问题,那么队列执行时不会因为某一条命令失败而回滚。
KEY | VALUE |
string | |
list | |
set | |
hash | |
zset |
Redis中的数据,总体上是键值对,不同数据类型指的是键值对中值的类型。
Redis中最基本的类型,它是key对应的一个单一值。二进制安全,不必担心由于编码等问题导致二进制数据变化。所以redis的string可以包含任何数据,比如jpg图片或者序列化的对象。Redis中一个字符串值的最大容量是512M。
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层是双向链表,所以它操作时头尾效率高,中间效率低(额外花费查找插入位置的时间)。
在Redis中list类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是2^32-1个。
list是一个有序可以重复的数据类型。
Redis的set是string类型的无序集合。它是基于哈希表实现的。set类型插入数据时会自动去重。最大可以包含2^32-1个元素。
本身就是一个键值对集合。可以当做Java中的Map<String,String>对待。每一个hash可以存储2^32-1个键值对。
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
Redis 在 3.2 推出 Geo 类型,该功能可以推算出地理位置信息,两地之间的距离。
用于大数据量基数统计,速度非常快,占用内存非常小。每个HyperLogLog键只需要花费12KB内存,就可以计算接近 2^64个不同元素的基数。比如计算网站UV(User view,用户访问数量,一个用户一天访问同一个URL地址多次合并为一次)。
直接对string的二进制位进行操作的一组命令
数据类型 | 应用场景 |
---|---|
string | 分布式Session存储 分布式数据库ID 计数器:统计网站访问量 |
hash | 存储对象信息(购物车中的商品信息) 存储表的信息 |
list | 实现队列、栈操作 汇总日志 粉丝列表 关注的人列表 |
set | 签到 打卡 点赞 |
zset | 排行榜 百度热点搜索 |
geospatial | 获取地理位置信息 两地之间的距离 |
hyperloglogs | 基数统计 |
bitmaps | 统计用户访问次数 |
Redis默认有16个数据库。115 # Set the number of databases. The default database is DB 0, you can select116 # a different one on a per-connection basis using SELECT <dbid> where117 # dbid is a number between 0 and 'databases'-1118 databases 16使用select进行切换,数据库索引从0开始127.0.0.1:6379> select 2OK127.0.0.1:6379[2]> select 0OK127.0.0.1:6379>
数据库长度就是这个数据库中存储了多少条数据
127.0.0.1:6379> dbsize(integer) 3
127.0.0.1:6379> flushall
在实际操作中对于Key的定义注意下面几点:
KEYS PATTERN把匹配PATTERN的key返回。PATTERN中可以使用“*”匹配多个字符,使用“?”匹配单个字符
TYPE KEY返回KEY对应的值的类型
MOVE KEY DB把一组键值对数据移动到另一个数据库中
DEL KEY [KEY ...]根据KEY进行删除,至少要指定一个KEY
EXISTS KEY [KEY ...]检查指定的KEY是否存在。指定一个KEY时,存在返回1,不存在返回0。可以指定多个,返回存在的KEY的数量。
RENAME KEY NEWKEY重命名一个KEY,NEWKEY不管是否是已经存在的都会执行,如果NEWKEY已经存在则会被覆盖。
RENAMENX KEY NEWKEY只有在NEWKEY不存在时能够执行成功,否则失败
TTL KEY以秒为单位查看KEY还能存在多长时间正数:剩余的存活时间(单位:秒)-1:永不过期-2:不存在的Key
EXPIRE KEY SECONDS给一个KEY设置在SECONDS秒后过期,过期会被Redis移除。
PERSIST KEY移除过期时间,变成永久key
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(要求:参与运算的数据必须是整数且不能超过整数Integer范围)
DECR KEY自减1(要求:参与运算的数据必须是整数且不能超过整数Integer范围)
INCRBY KEY INCREMENT原值+INCREMENT(要求:参与运算的数据必须是整数且不能超过整数Integer范围)
DECRBY KEY DECREMENT原值-DECREMENT(要求:参与运算的数据必须是整数且不能超过整数Integer范围)
GETRANGE KEY START END从字符串中取指定的一段,索引从0开始START是开始取值的索引END是结束取值的索引
SETRANGE KEY OFFSET VALUE从offset(从0开始的索引)开始使用VALUE进行替换包含offset位置
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设置新值,同时能够将旧值返回
LPUSH key value [value ...]针对key指定的list,从左边放入元素
RPUSH key value [value ...]针对key指定的list,从右边放入元素
LRANGE key start stop根据list集合的索引打印元素数据正着数:0,1,2,3,...倒着数:-1,-2,-3,...
LLEN key返回list集合的长度
LPOP key从左边弹出一个元素。弹出=返回+删除。
RPOP key从右边弹出一个元素。
RPOPLPUSH source destination从source中RPOP一个元素,LPUSH到destination中
LINDEX key index根据索引从集合中取值
LINSERT key BEFORE|AFTER pivot value在pivot指定的值前面或后面插入value如果pivot值有重复的,那么就从左往右数,以第一个遇到的pivot为基准BEFORE表示放在pivot前面AFTER表示放在pivot后面
LPUSHX key value只能针对存在的list执行LPUSH
LREM key count value根据count指定的数量从key对应的list中删除value具体执行时从左往右删除,遇到一个删一个,删完为止
LSET key index value把指定索引位置的元素替换为另一个值
LTRIM key start stop仅保留指定区间的数据,两边的数据被删除
SADD key member [member ...]给key指定的set集合中存入数据,set会自动去重
SMEMBERS key返回可以指定的set集合中所有的元素
SCARD key返回集合中元素的数量
SISMEMBER key member检查当前指定member是否是集合中的元素返回1:表示是集合中的元素返回2:表示不是集合中的元素
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,dA对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【测试数据
SADD testset a b c d e f g h i j k l m n o p q r s t u v w x y z aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo pp qq rr ss tt uu vv ww xx yy zz
】SSCAN key cursor [MATCH pattern] [COUNT count]基于游标的遍历。cursor是游标值,第一次显示第一块内容时,游标取值为0;根据后续返回的新的游标值获取下一块数据。直到游标值变成0,说明数据遍历完成。
SRANDMEMBER key [count]从集合中随机返回count个数量的元素,count不指定就返回1个(数据有可能重复出现)
SPOP key [count]从集合中随机弹出count个数量的元素,count不指定就弹出1个(保证不会有重复数据出现)
HSET key field value插入新数据返回1修改旧数据返回0
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要求field是新建的
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
ZRANGE key start stop [WITHSCORES]
ZCARD key
ZSCORE key member
ZINCRBY key increment member
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]在分数的指定区间内返回数据min参数可以通过 -inf 表示负无穷max参数可以通过 +inf 表示正无穷默认是闭区间可以通过 (min (max 形式指定开区间,例如:(50 (80
ZRANK key member先对分数进行升序排序,返回member的排名。排名从0开始
ZREM key member [member ...]
查询经纬度数据:
GEOADD key longitude latitude member [longitude latitude member ...]
规则:
1.两极无法直接添加,一般会下载城市数据,直接通过 Java 程序一次性导入。
2.取值范围
有效的经度从 -180 度到 180 度。
有效的纬度从 -85.05112878 度到 85.05112878 度。
当坐标位置超出指定范围时,该命令将会返回一个错误。
3.已经添加的数据,是无法再次往里面添加的。
192.168.109.100:6379> GEOADD "china:city" 114.085947 22.547 shenzhen
(integer) 1
192.168.109.100:6379> GEOADD "china:city" 113.280637 23.125178 guangzhou
(integer) 1
Geo类型在Redis内部其实是使用zset类型存储的,所以可以使用zset的命令进行常规操作。
192.168.109.100:6379> ZRANGE china:city 0 -1
1) "shenzhen"
2) "guangzhou"
192.168.109.100:6379> ZRANGE china:city 0 -1 WITHSCORES
1) "shenzhen"
2) "4046433733682118"
3) "guangzhou"
4) "4046533764066819"
192.168.109.100:6379> ZREM china:city guangzhou
(integer) 1
192.168.109.100:6379> GEOPOS china:city shenzhen
1) 1) "114.08594459295272827"2) "22.54699993773966327"
192.168.109.100:6379> GEODIST china:city guangzhou shenzhen km
"104.6426"
单位:
m 表示单位为米[默认值]。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。
192.168.109.100:6379> GEORADIUS china:city 110 20 1000 km WITHCOORD WITHDIST
1) 1) "shenzhen"2) "509.4622"3) 1) "114.08594459295272827"2) "22.54699993773966327"
2) 1) "guangzhou"2) "485.7406"3) 1) "113.28063815832138062"2) "23.12517743834835215"
WITHCOORD表示显示经纬度
WITHDIST表示显示到中心的距离
192.168.109.100:6379> GEORADIUSBYMEMBER china:city shenzhen 300 km WITHCOORD WITHDIST
1) 1) "shenzhen"2) "0.0000"3) 1) "114.08594459295272827"2) "22.54699993773966327"
2) 1) "guangzhou"2) "104.6426"3) 1) "113.28063815832138062"2) "23.12517743834835215"
一个集合中不重复元素的个数。例如:集合{1,2,5,1,7,2,5}中元素个数是7,但是基数是4。而hyperloglogs的主要功能就是进行基数统计。
192.168.109.100:6379> PFADD user:access:1 tom jerry andy jim andy jerry tom
(integer) 1
192.168.109.100:6379> PFADD user:access:2 andy jerry tom bob kate
(integer) 1
192.168.109.100:6379> PFADD user:access:3 mary harry tom jerry
(integer) 1
192.168.109.100:6379> PFCOUNT user:access:1 user:access:2 user:access:3
(integer) 8
192.168.109.100:6379> PFMERGE user:access:merge user:access:1 user:access:2 user:access:3
OK
192.168.109.100:6379> PFCOUNT user:access:merge
(integer) 8
直接对数据的二进制位进行操作
192.168.109.100:6379[5]> set a hello
OK
192.168.109.100:6379[5]> GETBIT a 0
(integer) 0
192.168.109.100:6379[5]> GETBIT a 1
(integer) 1
192.168.109.100:6379[5]> GETBIT a 2
(integer) 1
192.168.109.100:6379[5]> GETBIT a 3
(integer) 0
192.168.109.100:6379[5]> GETBIT a 4
(integer) 1
192.168.109.100:6379[5]> GETBIT a 5
(integer) 0
192.168.109.100:6379[5]> SETBIT a 5 1
(integer) 0
192.168.109.100:6379[5]> get a
"lello"
192.168.109.100:6379[5]> BITCOUNT a
(integer) 22
setbit设置指定比特位
getbit获取指定比特位
bitcount统计所有比特位中1的数量
Redis工作时数据都存储在内存中,万一服务器断电,则所有数据都会丢失。针对这种情况,Redis采用持久化机制来增强数据安全性。说白了就是把内存里的数据保存到硬盘上。
在满足特定触发条件时把内存中的数据本身作为一个快照保存到硬盘上的文件中。Redis默认开启RDB机制。
save 900 1
save 300 10
save 60 10000
含义
配置 | 含义 |
---|---|
save 900 1 | 900秒内至少有一次修改则触发保存操作 |
save 300 10 | 300秒内至少有10次修改则触发保存操作 |
save 60 10000 | 60秒内至少有1万次修改则触发保存操作 |
save或bgsave
这个命令也会产生dump.rdb文件,但里面是空的,没有意义
如果执行SHUTDOWN命令让Redis正常退出,那么此前Redis就会执行一次持久化保存。
配置项 | 取值 | 作用 |
---|---|---|
save | “” | 禁用RDB机制 |
dbfilename | 文件名,例如:dump.rdb | 设置RDB机制下,数据存储文件的文件名 |
dir | Redis工作目录路径 | 指定存放持久化文件的目录的路径。注意:这里指定的必须是目录不能是文件名 |
RDB 机制能够保证数据的绝对安全吗?
根据配置文件中指定的策略,把生成数据的命令保存到硬盘上的文件中。一个AOF文件的内容可以参照下面的例子:
*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命令是:
set num 10
incr num
incr num
incr num
配置项 | 取值 | 作用 |
---|---|---|
appendonly | yes | 启用AOF持久化机制 |
no | 禁用AOF持久化机制[默认值] | |
appendfilename | “文件名” | AOF持久化文件名 |
dir | Redis工作目录路径 | 指定存放持久化文件的目录的路径。注意:这里指定的必须是目录不能是文件名 |
appendfsync | always | 每一次数据修改后都将执行文件写入操作,是最安全的方式但是速度缓慢。 |
everysec | 每秒执行一次写入操作。折中。 | |
no | 由操作系统在适当的时候执行写入操作,Redis性能最好,数据保存次数最少。 |
::: warning
当 AOF 和 RDB 机制并存时,Redis 会优先采纳 AOF 机制。使用 AOF 持久化文件恢复内存中的数据。而 AOF 刚刚开启时 appendonly.aof 持久化文件中没有任何数据。拿空的 appendonly.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性能去节省硬盘空间。另外数据恢复也不是高频操作,所以节约数据恢复时间价值也不是非常大。
Redis服务器启动时如果读取了损坏的持久化文件会导致启动失败,此时为了让Redis服务器能够正常启动,需要对损坏的持久化文件进行修复。这里以AOF文件为例介绍修复操作的步骤。
第一步:备份要修复的appendonly.aof文件
第二步:执行修复程序
/usr/local/redis/bin/redis-check-aof --fix /usr/local/redis/appendonly.aof
第三步:重启Redis
注意:所谓修复持久化文件仅仅是把损坏的部分去掉,而没法把受损的数据找回。
适合大规模的数据恢复,速度较快
会丢失最后一次快照后的所有修改,不能绝对保证数据的高度一致性和完整性。Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑,但上述成立有条件,Linux也有优化手段
选择appendfsync always方式运行时理论上能够做到数据完整一致,但此时性能又不好。文件内容具备一定可读性,能够用来分析Redis工作情况。
持久化相同的数据,文件体积比RDB大,恢复速度比RDB慢。效率在同步写入时低于RDB,不同步写入时与RDB相同。
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文件,载入较新的那个。新浪微博就选用了这种架构。
命令名 | 作用 |
---|---|
MULTI | 表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中。 |
EXEC | 执行MULTI后面命令队列中的所有命令。 |
DISCARD | 放弃执行队列中的命令。 |
WATCH | “观察“、”监控“一个KEY,在当前队列外的其他命令操作这个KEY时,放弃执行自己队列的命令 |
UNWATCH | 放弃监控一个KEY |
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.
遇到了入队时即可检测到的错误,整个队列都不会执行。
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 在事务失败时不进行回滚,而是继续执行余下的命令”这种做法可能会让你觉得有点奇怪。以下是这种做法的优点:
1.Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
2.因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
有种观点认为 Redis 处理事务的做法会产生 bug , 然而需要注意的是, 在通常情况下, 回滚并不能解决编程错误带来的问题。 举个例子, 如果你本来想通过 INCR 命令将键的值加上 1 , 却不小心加上了 2 , 又或者对错误类型的键执行了 INCR , 回滚是没有办法处理这些情况的。
在使用WATCH命令监控一个KEY后,当前队列中的命令会由于外部命令的执行而放弃,这是乐观锁的体现。
悲观锁
认为当前环境非常容易发生碰撞,所以执行操作前需要把数据锁定,操作完成后释放锁,其他操作才可以继续操作。
乐观锁
认为当前环境不容易发生碰撞,所以执行操作前不锁定数据,万一碰撞真的发生了,那么检查版本号:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GX6y41qm-1683956525438)(./images/p02.png)]
Redis集群在运行时使用的是同一个可执行文件,只是对应的配置文件不同。
每个配置文件中相同的参数是:
daemonize yes
dir /usr/local/cluster-redis
不同的参数有:
配置项名称 | 作用 | 取值 |
---|---|---|
port | Redis服务器启动后监听的端口号 | 6000 7000 8000 |
dbfilename | RDB文件存储位置 | dump6000.rdb dump7000.rdb dump8000.rdb |
logfile | 日志文件位置 | /var/logs/redis6000.log /var/logs/redis7000.log /var/logs/redis8000.log |
pidfile | pid文件位置 | /var/run/redis6000.pid /var/run/redis7000.pid /var/run/redis8000.pid |
/usr/local/redis/bin/redis-server /usr/local/f
/usr/local/redis/bin/redis-server /usr/local/f
/usr/local/redis/bin/redis-server /usr/local/f
使用redis-cli停止指定服务器的命令格式如下:
/usr/local/bin/redis-cli -h IP地址 -p 端口号 shutdown
127.0.0.1:6000> info replication
# Replication
role:master
connected_slaves:0
刚刚启动的集群服务器中每一个节点服务器都认为自己是主服务器。需要建立主从关系。
在从机上指定主机位置即可
SLAVEOF 127.0.0.1 6000
在从机上执行命令
SLAVEOF NO ONE
通过哨兵服务器监控master/slave实现主从复制集群的自动管理。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5CsPS1oS-1683956525442)(./images/p04.png)]
1台哨兵检测到某节点服务器下线。
认为某个节点服务器下线的哨兵服务器达到指定数量。这个数量后面在哨兵的启动配置文件中指定。
提示:只有 master 服务器做客观下线的判断, slave 只做主观下线的判定。
心跳(heart beat)检查:客户端为了确认服务器端是否正在运行,不断的给服务器端发送数据库包。通过服务器端返回的数据包判断服务器端是否正在运行的工作机制。
简单起见我们只配置一台哨兵。我们所需要做的就是创建一个哨兵服务器运行所需要的配置文件。
vim /usr/local/f
格式 | sentinel monitor 为主机命名 主机IP 主机端口号 将主机判定为下线时需要Sentinel同意的数量 |
---|---|
例子 | sentinel monitor mymaster 127.0.0.1 6000 1 |
/usr/local/redis/bin/redis-server /usr/local/f –sentinel
+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【转换为从机】
假设两个 slave 服务器参与选举:
这个功能不是 Redis 的主要功能,实际开发时发布订阅方面的需求还是要找专门的消息队列产品来完成。
127.0.0.1:6379> SUBSCRIBE cctv
(press Ctrl-C to quit)
1) "subscribe"
2) "cctv"
3) (integer) 1
127.0.0.1:6379> PUBLISH cctv hai
(integer) 1
127.0.0.1:6379> SUBSCRIBE cctv
(press Ctrl-C to quit)
1) "subscribe"
2) "cctv"
3) (integer) 1
1) "message"
2) "cctv"
3) "hai"
Jedis 是我们 Java 程序连接 Redis 服务器的客户端。
MySQL | Redis | |
---|---|---|
连接 | Connection | Jedis |
连接池 | C3P0、DBCP、Druid等等 | JedisPool |
操作完成 | 关闭连接 | 关闭连接 |
bind后面跟的ip地址是客户端访问Redis时使用的IP地址。规则是:Redis要求客户端访问的地址,必须是 bind 配置项绑定的地址。看下面例子:
bind值 | 访问方式 |
---|---|
127.0.0.1 | ./redis-cli -h 127.0.0.1 |
192.168.200.100 | ./redis-cli -h 192.168.200.100 |
所以,结论是:bind 配置项要绑定可以对外暴露的本机地址。那么 Redis 为什么会有这样的要求?就是因为在实际项目中,Redis 不是给用户直接访问的,而是给 Java 程序访问的。所以 Redis 只要绑定一个内部访问地址,就能够屏蔽外部的访问,所以这个地址绑定机制,能够对 Redis 进行保护。
远程客户端访问Linux服务器时不能使用127.0.0.1,要使用网络上的实际IP。可以用ifconfig命令查看。
bind [你的实际IP]
bind 192.168.200.100
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>
//指定Redis服务器的IP地址和端口号
Jedis jedis = new Jedis("192.168.200.100", 6379);//执行ping命令
String ping = jedis.ping();System.out.println(ping);//关闭连接
jedis.close();
//声明Linux服务器IP地址
String host = "192.168.200.100";//声明Redis端口号
int port = Protocol.DEFAULT_PORT;//创建连接池对象
JedisPool jedisPool = new JedisPool(host, port);//获取Jedis对象连接Redis
Jedis jedis = Resource();//执行具体操作
String ping = jedis.ping();System.out.println(ping);//关闭连接
jedisPool.close();
本文发布于:2024-01-31 12:32:39,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170667556028541.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |