欢迎投稿

今日深度:

Redis,

Redis,


一、安装

安装gcc

yum install -y gcc

安装tcl

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz  
sudo tar xzvf tcl8.6.1-src.tar.gz  -C /usr/local/  
cd  /usr/local/tcl8.6.1/unix/  
sudo ./configure  
sudo make  
sudo make install

安装redis

wget http://download.redis.io/releases/redis-4.0.11.tar.gz

tar -zxvf redis-4.0.11.tar.gz 

mv redis-4.0.11 /usr/local/redis

make MALLOC=libc

cd src && make install

启动与测试

#启动
cd /usr/local/redis/src
redis-server
#连接redis
cd /usr/local/redis/src
redis-cli

image

image

配置后台启动

mkdir etc && cp ./redis.conf  ./etc/
#将136中的daemonize no改为yes
vi ./etc/redis.conf

#指定配置文件启动
./redis-server /usr/local/redis/etc/redis.conf

image

image

image

为redis设置环境变量

vim /etc/profile (在文件的末尾添加这两行)
切换到任意目录,执行which redis-server
image

为客户端配置密码

修改redis.conf 其中500行,root为配置的密码
image

image

参考

https://github.com/timespacegroup/docs/blob/master/server-software/Redis-3.2.9-single.md


二、持久化

redis支持RDB和AOF两种持久化机制,持久化功能有效的避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

RDB

RDB持久化是把当前进程数据,生成快照保存到硬盘的过程。
RDB是redis默认的持久化方案。会在指定目录下生成一个dump.rdb文件。
RDB的持久化方案分为手动触发和自动触发

配置RDB持久化

配置redis.conf,大致如下位置
image
1、15min内有一个key更改;5min内有10个key更改;1min内有10000个key更改会触发快照持久化。
2、可以选择注释所以策略,不进行持久化,也可以使用save ""来进行关闭持久化。

image

stop-writes-on-bgsave-error yes
参见:https://blog.csdn.net/hexieshangwang/article/details/47254087

RDB触发时机

1、满足配置的save策略(自动触发)
2、手动执行命令save或者是命令bgsave(手动触发)。
3、执行flushall命令,清空数据库所有数据,意义不大
4、执行shutdown命令,保证服务器正常关闭且不丢失任何数据,意义也不大。

save and bgsave

1、save为阻塞,bgsave为异步,一般使用bgsave。

操作演示

image
image

AOF

1、AOF采用日志的形式来记录每个写操作,已文本的形式存储每条写命令。
2、redis重启的会根据日志文件,从头至尾执行一次指令以完成数据的恢复

配置AOF

image

appendonly no
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no

AOF重写

AOF的工作原理是将写操作记录到文件,随着写操作越来越多,文件的冗余内容会越来越多,所有redis增加了AOF重写机制。
当AOF文件大小超过设定的阈值时,redis就会对AOF文件进行压缩。
重写的原理是:fork出新的进程,将当前内存的数据写入临时文件中,然后以临时文件替换庞大的旧的AOF文件。

参考:
https://segmentfault.com/a/1190000012908434
https://www.cnblogs.com/itdragon/p/7906481.html


三、事务

严格意义来讲,redis事务和我们理解的传统数据库的事务是不一样的。redis的事务实质上是命令的集合,在一个事务中要么所有的命令都被执行,要么所有的命令都不执行。一个事务从开始到执行会经历以下三个阶段:开始事务、命令入列、执行事务。redis事务涉及的命令有:MULTI、EXEC、DISCARD、WATCH。

MULTI

MULTI命令的执行标记着事务的开始,这个命令唯一的作用就是,将客户端的REDIS_MULTI选项打开,让客户端从非事务状态切换到事务状态。

127.0.0.1:6379> multi
OK

命令入列

当客户端处于非事务状态时,所有发送给服务器端的命令都会立即被服务器执行。
但是,当客户端进入事务状态后,服务器在收到来自客户端的命令时,不会立即执行命令,而是将这些命令全部放进一个事务队列里,然后返回QUEUED,表示命令已入队列。
image

[root@k8s-master-101 ~]# redis-cli -a root
Warning: Using a password with '-a' option on the command line interface may not be safe.
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a a
QUEUED
127.0.0.1:6379> set b b
QUEUED
127.0.0.1:6379> get a
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "a"
127.0.0.1:6379> get a 
"a"
127.0.0.1:6379> get b
"b"
127.0.0.1:6379> 

执行事务

如果客户端处于事务状态, 在EXEC 命令执行时, 服务器根据客户端所保存的事务队列, 以先进先出(FIFO)的方式执行事务队列中的命令: 最先入队的命令最先执行, 而最后入队的命令最后执行。
相反的,DISCARD命令会清空队列取消命令的执行。
image
前面说到, 当客户端进入事务状态之后, 客户端发送的命令就会被放进事务队列里。

但其实并不是所有的命令都会被放进事务队列, 其中的例外就是 EXEC 、 DISCARD 、 MULTI 和 WATCH 这四个命令 —— 当这四个命令从客户端发送到服务器时, 它们会像客户端处于非事务状态一样, 直接被服务器执行

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a a
QUEUED
127.0.0.1:6379> set b b
QUEUED
127.0.0.1:6379> get a
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) "a"
127.0.0.1:6379> get a 
"a"
127.0.0.1:6379> get b
"b"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a aa
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get a
"a"
127.0.0.1:6379> 

WATCH

WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。

127.0.0.1:6379> WATCH a
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET a "aaa"
QUEUED
127.0.0.1:6379> exec
(nil)

在执行EXEC前,使用另一客户端执行set a a。

127.0.0.1:6379> set a a
OK

参考:https://redisbook.readthedocs.io/en/latest/feature/transaction.html?from=singlemessage


docker pull redis:5.0.3
docker run -d -p 6379:6379 --name redis redis:5.0.3

#-p 6379:6379 将宿主机的端口映射到容器
#-v /root/redis/data:/data 将本地目录挂载到容器的/data目录,redis使用此目录持久化
#-v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf 映射配置文件
# --name redis redis:5.0.3 使用redis redis:5.0.3镜像创建name为redis的容器
#redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "123456" 在容器中启动以指定的配置文件启动redis,密码为123456
docker run -d --privileged=true -p 6379:6379 -v /root/redis/data:/data -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf --name redis redis:5.0.3 redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "123456"

#使用redisClient 连接容器的redis,创建key=dd value=dd的string类型的键值对

#进入容器 连接上redis,查看dd的值 
[root@localhost ~]# docker exec -it redis redis-cli -a '123456'
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get dd
"dd"

www.htsjk.Com true http://www.htsjk.com/redis/43468.html NewsArticle Redis, 一、安装 安装gcc yum install -y gcc 安装tcl wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz sudo tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/ cd /usr/local/tcl8.6.1/unix/ sudo ./configure sudo make sudo make in...
评论暂时关闭