Redis

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: CentOS 7安装redis4.0.11 redis持久化机制RDB、AOF radis事务:MULTI、命令入列、EXEC、DISCARD、WATCH

一、安装

安装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"
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
20天前
|
缓存 NoSQL Redis
说说你对redis的理解2
说说你对redis的理解2
27 6
|
1月前
|
缓存 负载均衡 NoSQL
这样学Redis,才能技高一筹
【7月更文挑战第18天】
36 3
|
2月前
|
存储 NoSQL 网络安全
Redis
Redis
16 0
|
3月前
|
监控 NoSQL 算法
Redis为什么这么快
Redis为什么这么快
29 4
|
2月前
|
消息中间件 缓存 NoSQL
【Redis】 初识 Redis
【Redis】 初识 Redis
|
3月前
|
存储 SQL NoSQL
[Redis]——初识Redis
[Redis]——初识Redis
|
12月前
|
缓存 NoSQL 关系型数据库
redis-1
redis-1
43 1
|
11月前
|
消息中间件 存储 负载均衡
|
设计模式 移动开发 缓存
可算知道Redis为什么这么快了
可算知道Redis为什么这么快了
121 0