方便工作中复习,学习巩固。
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)
下面是官方的bench-mark数据:
测试完成了50个并发执行100000个请求。设置和获取的值是一个256字节字符串。
结果:读的速度是110000次/s,写的速度是81000次/s
2008年,意大利一家创业公司Merzia的创始人Salvatore Sanfilippo为了避免MySQL的低性能,亲自定做一个数据库,并于2009年开发完成,这个就是Redis.
从2010年3月15日起,Redis的开发工作由VMware主持。
从2013年5月开始,Redis的开发由Pivotal赞助。
说明:Pivotal公司是由EMC和VMware联合成立的一家新公司**。**Pivotal希望为新一代的应用提供一个原生的基础,建立在具有领导力的云和网络公司不断转型的IT特性之上。Pivotal的使命是推行这些创新,提供给企业IT架构师和独立软件提供商。
string
、hash
、list
、set
、sorted set
yum -y install gcc-c++ autoconf automake
tar -zxvf redis-5.0.3.tar.gz
切换到解压目录
cd redis-5.0.3/
## 编译源代码
make MALLOC=libc
## 创建redis的安装目录
mkdir -p /opt/sxt/redis
## 如果需要指定安装路径,需要添加PREFIX参数**
make PREFIX=/opt/sxt/redis/ install
Redis-cli
:客户端
Redis-server
:服务器端
##redis服务默认端口号为6379
./redis-server
复制redis.conf至安装路径下
## 创建一个配置文件目录
mkdir -p /opt/sxt/redis/conf
## 拷贝配置文件到目录中
cp ~/redis-5.0.3/redis.conf /opt/sxt/redis/conf
修改安装路径下的redis.conf,将daemonize
修改为yes
修改配置文件redis.conf
注释掉bind 127.0.0.1
可以使所有的ip访问redis,若是想指定多个ip访问,但并不是全部的ip访问,可以bind设置
关闭保护模式,修改为no
添加访问认证
我们可以修改默认数据库的数量 默认16,修改database 32则默认为32个数据库
修改后kill -9 XXXX杀死redis进程,重启redis
再次建立连接 -> 成功
-h
:用于指定ip
-p
:用于指定端口
-a
:用于指定认证密码
PING命令返回PONG
exists 查询key是否存在
keys 查询是否存在指定的key
type 查询key的数据类型
scan 扫描当前库中所有的key
set
:添加一条String类型数据
get
:获取一条String类型数据
mset
:添加多条String类型数据
mget
:获取多条String类型数据
incr
:在value基础上加1
decr
:在value基础上减1
hset
:添加一条hash类型数据
hget
:获取一条hash类型数据
hmset
:添加多条hash类型数据
hmget
:获取多条hash类型数据
hgetAll
:获取指定所有hash类型数据
hdel
:删除指定hash类型数据(一条或多条)
lpush
:左添加(头)list类型数据
rpush
:右添加(尾)类型数据
lrange
: 获取list类型数据start起始下标 end结束下标 包含关系
llen
:获取条数
lrem
:删除列表中几个指定list类型数据
lrem key count value
count > 0 从前向后删除count个value
count <0 从后向前删除 绝对值(count) 个value
count = 0 删除所有的value
sadd
:添加set类型数据
smembers
:获取set类型数据
scard
:获取条数
srem
:删除数据
sorted set是通过分数值来进行排序的,分数值越大,越靠后。
zadd
:添加sorted set类型数据
zrange
:获取sorted set类型数据
zcard
:获取条数
zrem
:删除数据
zadd需要将 Float或者 Double类型分数值参数,放置在值参数之前
zscore|ZINCRBY
:ZINCRBY key increment member 为有序集key的成员member的score值加上增量increment
Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) :
expired 英 /ɪkˈspaɪəd/ adj. 过期的;失效的
EXPIRE
:用于将键key
的生存时间设置为ttl
秒。---->例如 Expire zhangsan 300s
PEXPIRE :用于将键
key 的生存时间设置为
ttl` 毫秒。—>例如 PExpire zhangsan 3000ms
EXPIREAT
:用于将键key
的过期时间设置为timestamp
所指定的秒数时间戳。例如–>EXPIREAT zhangsna 时间戳
PEXPIREAT
:用于将键key
的过期时间设置为timestamp
所指定的毫秒数时间戳。如->EXPIREAT key 时间戳
TTL
:获取的值为-1说明此key
没有设置有效期,当值为-2时证明过了有效期。
方法一
方法二
方法三
第一个参数:key
第二个参数:value
第三个参数:
NX
是key不存在时才set,防止覆盖
XX
是key存在时才set,不创建新的key
第四个参数:EX
是秒,PX
是毫秒
del
:用于删除数据(通用,适用于所有数据类型)
hdel
:用于删除hash类型数据
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队
Multi、Exec、discard
事务的错误处理
事务锁的机制
redis是一个内存数据库,数据保存在内存中,虽然内存的数据读取速度快,但是很容易发生丢失。Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照,这是默认的持久化方式
这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb
RDB提供了三种触发机制:save、bgsave、自动化
save触发方式
bgsave触发模式
自动触发
自动触发是由我们的配置文件来完成的。
#配置文件
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
save 900 1
save 300 10
save 60 10000
#配置文件的意义
服务器在 900 秒之内,对数据库进行了至少 1 次修改
服务器在 300 秒之内,对数据库进行了至少 10 次修改
服务器在 60 秒之内,对数据库进行了至少 10000 次修改
stop-writes-on-bgsave-error
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
# 默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。
stop-writes-on-bgsave-error yes
rdbcompression
# Compress string objects using LZF when dump .rdb databases?
# For default that's set to 'yes' as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
# 默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。rdbcompression yes
rdbchecksum
# RDB files created with checksum disabled have a checksum of zero that will# tell the loading code to skip the check.
# 默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗rdbchecksum yes
dbfilename
# The filename where to dump the DB# 设置快照的文件名,默认是 dump.rdbdbfilename dump.rdb
dir
# The working directory.# The DB will be written inside this directory, with the filename specified# above using the 'dbfilename' configuration directive.# The Append Only File will also be created inside this directory.# Note that you must specify a directory here, not a file name.# 设置快照文件的存放路径,这个配置项一定是个目录,而不能是文件名dir ./
RDB的优势和劣势
rewrite策略
AOF配置信息
############################## APPEND ONLY MODE ###############################
# By default Redis asynchronously dumps the dataset on disk. This mode is
# good enough in many applications, but an issue with the Redis process or
# a power outage may result into a few minutes of writes lost (depending on
# the configured save points).
#
# The Append Only File is an alternative persistence mode that provides
# much better durability. For instance using the default data fsync policy
# (see later in the config file) Redis can lose just one second of writes in a
# dramatic event like a server power outage, or a single write if something
# wrong with the Redis process itself happens, but the operating system is
# still running correctly.
#
# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file
# with the better durability guarantees.
appendonly no
# The name of the append only file (default: "appendonly.aof")appendfilename "appendonly.aof"
# Redis supports three different modes:
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.
# appendfsync always
appendfsync everysec
# appendfsync no
# 重写的时机-条件
# Automatic rewrite of the append only file.
# Redis is able to automatically rewrite the log file implicitly calling
# BGREWRITEAOF when the AOF log size grows by the specified percentage.
#
# This is how it works: Redis remembers the size of the AOF file after the
# latest rewrite (if no rewrite has happened since the restart, the size of
# the AOF at startup is used).
#
# This base size is compared to the current size. If the current size is
# bigger than the specified percentage, the rewrite is triggered. Also
# you need to specify a minimal size for the AOF file to be rewritten, this
# is useful to avoid rewriting the AOF file even if the percentage increase
# is reached but it is still pretty small.
#
# Specify a percentage of zero in order to disable the automatic AOF
# rewrite feature.
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
AOF的触发策略
AOF的优势和劣势
Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。
在Redis主配置文件文件夹中创建配置文件
主节点配置文件
## 导入一个通用配置文件
include /opt/sxt/redis/conf/redis.conf
## 当前主服务器端口
port 7100
## 设置主服务密码
requirepass 123456
## 当前主服务进程ID
pidfile /var/run/redis_7100.pid
## 当前主服务RDB文件名称
dbfilename dump7100.rdb
## 当前主服务文件存放路径
dir /opt/sxt/redis/conf/
从节点需要配置
##导入一个通用配置文件
include /opt/sxt/redis/conf/redis.conf
##当前主服务器端口
port 7200
##当前主服务进程ID
pidfile /var/run/redis_7200.pid
##当前主服务RDB文件名称
dbfilename dump7200.rdb
##当前主服务文件存放路径
dir /opt/sxt/redis/conf/
##同步master节点的网络信息(低版本必须使用slaveof,高版本推荐使用replicaof)
replicaof 127.0.0.1 7100
##设置master节点的密码信息
masterauth 123456
##从节点只做读的操作,保证主从数据的一致性
slave-read-only yes
在redis客户端命令行中输入(临时)
结束从服务器的命运(结束)
Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。
Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要手动将从节点晋升为主节点,同时还要通知客户端更新主节点地址
Sentinel哨兵是redis官方提供的高可用方案,可以用它来监控多个Redis服务实例的运行情况
哨兵内部领导者选举
1). 每个做主观下线的sentinel节点向其他sentinel节点发送上面那条命令,要求将它设置为领导者。
2). 收到命令的sentinel节点如果还没有同意过其他的sentinel发送的命令(还未投过票),那么就会同意,否则拒绝。
3). 如果该sentinel节点发现自己的票数已经过半且达到了quorum的值,就会成为领导者。
4). 如果这个过程出现多个sentinel成为领导者,则会等待一段时间重新选举。
Master选举
状态更换
通知客户端
搭建多台计算机的主从集群
Host | 端口 | 节点分类 | Sentinel |
---|---|---|---|
192.168.204.161 | 20601 | master | 20600 |
192.168.204.162 | 20601 | slave | 20600 |
192.168.204.163 | 20601 | slave | 20600 |
Master节点
## 导入一个通用配置文件
include /opt/sxt/redis/conf/redis.conf
## 当前主服务器IP和端口
bind 0.0.0.0
port 20601
## 去掉安全模式
protected-mode no
## 设置主服务密码
requirepass 123456
## 当前主服务进程ID
pidfile /var/run/redis_20601.pid
## 当前主服务RDB文件名称
dbfilename dump20601.rdb
## 当前主服务文件存放路径
dir /opt/sxt/redis/conf/
## 设置master节点的密码信息
masterauth 123456
## 设置时候后台启动
daemonize no
## 导入一个通用配置文件
include /opt/sxt/redis/conf/redis.conf
## 当前主服务器IP和端口
bind 0.0.0.0
port 20601
## 去掉安全模式
protected-mode no
## 设置主服务密码
requirepass 123456
## 当前主服务进程ID
pidfile /var/run/redis_20601.pid
## 当前主服务RDB文件名称
dbfilename dump20601.rdb
## 当前主服务文件存放路径
dir /opt/sxt/redis/conf/
## 同步master节点的网络信息(低版本必须使用slaveof,高版本推荐使用replicaof)
replicaof 192.168.204.161 20601
## 设置master节点的密码信息
masterauth 123456
## 从节点只做读的操作,保证主从数据的一致性
slave-read-only yes
## 设置时候后台启动
daemonize no
- 三台计算机分别启动Redis
- redis-server /opt/sxt/redis/conf/redis20601.conf
## redis-sentinel /opt/sxt/redis/conf/sentinel.conf
## 设置哨兵的接口
port 20600
## sentinel monitor 关键字
## master20601 给主从服务器集群起一个名字(监控主服务器,从服务器的信息也就获取了)
## 192.168.204.161 20601 主服务器的IP和端口
## 2主服务器失效的统计数,超过2票就认为失效
sentinel monitor master20601 192.168.204.161 20601 2
## 设置主服务器密码
sentinel auth-pass master20601 123456
## 主服务器下线超过10秒就进行切换(默认30S)
sentinel down-after-milliseconds master20601 10000
## 故障转移超时时间
sentinel failover-timeout master20601 180000
## 故障转移时,允许有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长
sentinel parallel-syncs master20601 1
## 关闭安全校验
protected-mode no
在Redis中,实现高可用的技术主要包括持久化、复制、哨兵和集群,下面简单说明它们的作用,以及解决了什么样的问题:
持久化:持久化是最简单的高可用方法。它的主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失。
复制:复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。
哨兵:在复制的基础上,哨兵实现了自动化的故障恢复。缺陷是写操作无法负载均衡,存储能力受到单机的限制。
集群:通过集群,Redis解决了写操作无法负载均衡以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。
问题:
2的32方
取模当我们添加服务器或者删除服务器
它只影响处理节点的下一个节点
均匀一致性hash的目标是如果服务器有N台,客户端的hash值有M个,
那么每个服务器应该处理大概M/N个用户的。也就是每台服务器负载尽量均衡
Host | Master | Slave |
---|---|---|
192.168.204.161 | 30601 | 30602 |
192.168.204.162 | 30601 | 30602 |
192.168.204.163 | 30601 | 30602 |
## 导入默认配置文件
include /opt/sxt/redis/conf/redis.conf
## 当前主服务器Host和端口
bind 0.0.0.0
port 30601
## 后台模式运行
daemonize no
## 关闭保护模式
protected-mode no
## 设置主服务密码
requirepass 123456
## 设置从服务器密码
masterauth 123456
## 当前主服务进程ID
pidfile /var/run/redis_30601.pid
## 当前主服务RDB文件名称
dbfilename dump30601.rdb
## 当前主服务文件存放路径
dir /opt/sxt/redis/conf/
## 开启aof持久化方式
appendonly yes
## 设置AOF文件名字
appendfilename "appendonly30601.aof"
##集群相关
cluster-enabled yes
cluster-config-file nodes-30601.conf
cluster-node-timeout 5000
## 导入默认配置文件
include /opt/sxt/redis/conf/redis.conf
## 当前主服务器Host和端口
bind 0.0.0.0
port 30602
## 后台模式运行
daemonize no
## 关闭保护模式
protected-mode no
## 设置主服务密码
requirepass 123456
## 设置从服务器密码
masterauth 123456
## 当前主服务进程ID
pidfile /var/run/redis_30602.pid
## 当前主服务RDB文件名称
dbfilename dump30602.rdb
## 当前主服务文件存放路径
dir /opt/sxt/redis/conf/
## 开启aof持久化方式
appendonly yes
## 设置AOF文件名字
appendfilename "appendonly30602.aof"
##集群相关
cluster-enabled yes
cluster-config-file nodes-30602.conf
cluster-node-timeout 5000
redis-server /opt/sxt/redis/conf/redis20601.conf
redis-server /opt/sxt/redis/conf/redis20602.conf
# --cluster-replicas 1 表示主从配置比,1表示的是1:1,前三个是主,后三个是从
# 若配置文件中设置的密码,则还需要加上-a passwod
redis-cli --cluster create 192.168.204.161:30601 192.168.201.102:30601
192.168.201.103:30601
192.168.204.161:30602 192.168.201.102:30602 192.168.201.103:30602 --cluster-replicas 1 -a 123456
redis-cli -h 127.0.0.1 -p 20601 -a 123456
# 查看集群信息
cluster info
# 查看节点列表
cluster nodes
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
云村的重逢/致爱梵高,自由旋转的向日葵