文章目录
Redis介绍与安装
-
RedisRedis为缓存数据库(中间件),即泛指非关系型数据库 NoSQL(NoSQL = Not Only SQL),NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
-
关系型数据库(RMDB)mysql,sqlite,oracle,即存在强烈的数据关系),是对不同于传统的关系型数据库的数据库管理系统的统称。
几种企业中常用的缓存数据库对比测试:
测试结果:
- Memcached:多核的缓存服务,更加适合于多用户并发访问次数(访问次数较少的应用场景)
- Redis:单核缓存服务,在单节点情况下,更加适合少量用户,多次访问的应用场景
Redis介绍
Redis:
全称:Remote Dictionary Server
Redis是一个开源的数据结构服务器
支持网络、可持久化日志型数据库
支持多数据类型:字符串、列表、集合、有序集合等
优缺点:
优点:
高性能读写、多数据类型支持、数据持久化、高可用架构、自定义虚拟内存、分布式分片集群、单线程读写性能极高
缺点:
不支持多线程读写,相比Memcached会慢
特性:
透明性:
分布式系统对用户是透明的,让用户无需了解就能使用
扩展性:
这也是分布式系统最大的特点,它能根据需求的增加而扩展
横向扩展:使集群整体性能得到线性提升
纵向扩展:扩展单台服务器的性能使集群性能得到提升
可靠性:
分布式系统不允许单点失效的问题存在,若一台服务器挂了,其他服务器可接替工作,具有持续服务的特性
高性能:
分布式设计分布式系统的一个初衷,透明、灵活、且可靠
部署
二进制部署
1.编译安装
# 下载Redis安装包并解压
[root@k8s-master1 ~]# wget https://download.redis.io/releases/redis-6.0.9.tar.gz
[root@k8s-master1 ~]# tar -xf redis-6.0.9.tar.gz
[root@k8s-master1 ~]# cd redis-6.0.9
# 安装编译工具依赖包,两个yum不要合在一起安装,会报错
[root@k8s-master1 redis]# yum -y install centos-release-scl
[root@k8s-master1 redis]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# 编译安装
[root@k8s-master1 redis]# scl enable devtoolset-9 bash
[root@k8s-master1 redis]# make -j
[root@k8s-master1 redis]# make PREFIX=/usr/local/redis install
# 启动Redis
[root@k8s-master1 redis]# /usr/local/redis/bin/redis-server
2.容器安装
1)创建部署清单
kind: Deployment
apiVersion: apps/v1
metadata:
name: redis-deployment
spec:
selector:
matchLabels:
app: redis
deploy: redis
template:
metadata:
labels:
app: redis
deploy: redis
spec:
containers:
- name: redis
image: redis:6.0.9
2)创建Service
kind: Service
apiVersion: v1
metadata:
name: redis-deployment-svc
spec:
ports:
- port: 6379
targetPort: 6379
name: redis
protocol: TCP
selector:
app: redis
deploy: redis
type: NodePort
3.使用systemctl管理redis
1)编写System管理文件
cat > /usr/lib/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
2)启动
# 重载配置
[root@k8s-master1 ~]# systemctl daemon-reload
# 先手动启动一下,再用systemctl启动,否则直接用systemctl会卡主
[root@k8s-master1 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
[root@k8s-master1 ~]# pkill -9 redis
# systemctl启动redis
[root@k8s-master1 ~]# systemctl start redis
3)添加到环境变量
方式一:推荐
# Redis
export PATH=$PATH:/usr/local/redis/bin
方式二:
# Redis
export REDIS_HOME=/usr/local/redis
PATH=$PATH:$REDIS_HOME/bin
4.设置redis密码
# 修改配置文件
[root@k8s-master1 ~]# vim /usr/local/redis/bin/redis.conf
requirepass 123
# 重启redis
[root@k8s-master1 ~]# systemctl restart redis
5.测试登录
# 此时定义值是失败的,需要验证密码才可以
[root@k8s-master1 ~]# redis-cli
127.0.0.1:6379> set a b
(error) NOAUTH Authentication required.
登录后定义值即可成功
# 登录方式1:简单,但密码会暴露在终端
[root@k8s-master1 ~]# redis-cli -a 123
127.0.0.1:6379> set a b
OK
# 登录方式2:
[root@k8s-master1 ~]# redis-cli
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> set a b
OK
6.解决中文乱码的问题
# 定义一个中文值,获取时会乱码(英文无碍)
127.0.0.1:6379> set name 张三
OK
127.0.0.1:6379> get name
"\xe5\xbc\xa0\xe4\xb8\x89"
# 解决乱码,需在登录时就加入 --raw选项
[root@k8s-master1 ~]# redis-cli --raw
127.0.0.1:6379> auth 123
OK
127.0.0.1:6379> get name
张三
Docker方式部署
配置文件
mkdir -p /data/docker-server/redis/{data,conf}
redis.conf
直接copy即可,登录方式:
redis-cli -a 123
[root@Centos8 ferry]# cat /data/docker-server/redis/conf/redis.conf
requirepass 123
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile "/data/redis.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 100mb
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
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
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events Ex
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
部署
脚本
redis_start.sh
#!/bin/bash
docker run -d \
-p 6379:6379 \
-v /data/docker-server/redis/data:/data \
-v /data/docker-server/redis/conf/users.acl:/usr/local/etc/redis/users.acl \
-v /data/docker-server/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--name redis \
redis:latest redis-server /usr/local/etc/redis/redis.conf
部署
sh redis_start.sh
非交互式执行命令
在命令行直接执行多条命令:将命令写入文件,通过脚本调取执行
需求:
a
为业务场景验证码的变量名,会不定期变动,需要每分钟重置为123
/root/scripts/redis_reset_test_user_pwd.txt
创建命令文本
# 选择数据库 db1
SELECT 1
# 设定值
SET a '123'
/root/scripts/redis_reset_test_user_pwd.sh
编写执行脚本
#!/bin/bash
cat /root/scripts/redis_reset_test_user_pwd.txt | redis-cli -h xxx.redis.com -p 6379 -a username:password
加入定时任务
* * * * * /usr/bin/sh /root/scripts/redis_reset_test_user_pwd.sh &>/dev/null
手动查看值
等待
1
分钟后查看
[root@h156 ~]# redis-cli -h xxx.redis.com -p 6379 -a username:password GET a
"123"