Redis 实战笔记
Redis
yum源安装
yum install -y epel-release redis
systemctl enable redis
systemctl start redis
systemctl status redis
redis 简介
redis 特点
Redis与 Memcache的对比
对比测试
Redis应用场景
多实例
# 去除注释
sed -ri '/^$|#/d' redis.conf
# 后台启动
[root@mysql-56 redis-6.0.9]# grep daemon redis.conf
daemonize yes
[root@mysql-56 redis-6.0.9]# ./src/redis-server redis.conf
[root@mysql-56 redis-6.0.9]# ./src/redis-cli -p 6380
127.0.0.1:6380>
redis 源码安装
#安装
wget http://download.redis.io/releases/redis-3.2.6.tar.gz
tar xzf redis-3.2.6.tar.gz
cd redis-3.2.6
make#运行
src/redis-server
#客户端
src/redis-cli#查看路径
rpm -ql redis # 启动客户端端口
redis-cli -p 6380
配置文件
port 6380 # 端口
daemonize yes # 后台运行
pidfile /var/run/redis_6380.pid #进程文件
logfile "/data/redis6380/redis.log" #日志文件
appendonly yes #日志开关
dbfilename dump.rdb # 持久化数据文件[root@mysql-56 redis-6.0.9]# ls /data/redis6380/
redis.conf redis.log redis-server
redis 保护模式
[root@mysql-56 redis-6.0.9]# cat /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target[Service]
ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755[Install]
WantedBy=multi-user.target
Bind 保护模式
- Redis 3.2 新特性
- Bind
- 禁止 protected-mode
- 增加 requirepass {password}
- 在redis-cli中使用
[root@mysql-56 redis-6.0.9]# grep prote redis.conf
protected-mode yes
requirepass 123456127.0.0.1:6380> SHUTDOWN
not connected> exit
127.0.0.1:6380> get foo
(error) NOAUTH Authentication required.
127.0.0.1:6380> auth 123456
OK
127.0.0.1:6380> get a
"1"
redis 数据
持久化
- RDB持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
- AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF文件中的命令全部以Redis协议的格式来保存,新命令会被追加到文件的末尾。Redis还可以在后台对AOF文件进行重写(rewrite),使得AOF文件的体积不会超出保存数据集状态所需的实际大小。
- Redis还可以同时使用AOF持久化和RDB持久化。在这种情况下,当 Redis重启时,它会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。
- 你甚至可以关闭持久化功能,让数据只在服务器运行时存在。
持久化策略
压缩
同步
核心实战
数据类型
常规操作
字符串
Append #将value追加到key原来的值的末尾
INCRBY #增加
DECRBY #减少DECRBY count 20 减去指定量
Mget mset #同时获取设置一个或多个键值对
STRLEN #返回字符串长度
INCR DECR #将值增或减1
练习
127.0.0.1:6380> set name lewen
OK
127.0.0.1:6380> get name
"lewen"
127.0.0.1:6380> type name
string127.0.0.1:6380> APPEND name 123
(integer) 8
127.0.0.1:6380> get name
"lewen123"127.0.0.1:6380> mset name fadewalk age 24
OK
127.0.0.1:6380> get name
"fadewalk"
127.0.0.1:6380> get age
"24"127.0.0.1:6380> mget name age
1) "fadewalk"
2) "24"127.0.0.1:6380> STRLEN name
(integer) 8
127.0.0.1:6380> STRLEN age
(integer) 2127.0.0.1:6380> INCR age
(integer) 25
127.0.0.1:6380> INCR age
(integer) 26127.0.0.1:6380> DECR age
(integer) 25
127.0.0.1:6380> DECR age
(integer) 24重复set 会覆盖掉前面的值127.0.0.1:6380> EXISTS name
(integer) 1
127.0.0.1:6380> INCRBY age
(error) ERR wrong number of arguments for 'incrby' command
127.0.0.1:6380> INCRBY age 100
(integer) 124
hash
127.0.0.1:6380> hset user:1 name lewen
(integer) 1
127.0.0.1:6380> TYPE user:1
hash
127.0.0.1:6380> hset user:1 set male
(integer) 1127.0.0.1:6380> hgetall user:1
1) "name"
2) "lewen"
3) "age"
4) "24"
5) "set"
6) "male"
127.0.0.1:6380> hget user:1 name
"lewen"
127.0.0.1:6380> hget user:1 age
"24"
127.0.0.1:6380> hmget user:1 name age
1) "lewen"
2) "24"删除
127.0.0.1:6380> hdel user:1 name
(integer) 1
127.0.0.1:6380> hdel user:1 set
(integer) 1
127.0.0.1:6380> del user:1
(integer) 1
127.0.0.1:6380> keys *
1) "age"
2) "name"127.0.0.1:6380> hmset user name lewen age 24 sex male
OK
127.0.0.1:6380> HINCRBY user age 10
(integer) 34
127.0.0.1:6380> HINCRBY user age -5
(integer) 29
list
127.0.0.1:6380> lpush found gf yfd jy fc zs
(integer) 5
127.0.0.1:6380> type found
list127.0.0.1:6380> lrange found 0 10
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
5) "gf"127.0.0.1:6380> lrange found 0 3
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
127.0.0.1:6380> lrange found 0 5
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
5) "gf"127.0.0.1:6380> lpush found wj
(integer) 6
127.0.0.1:6380> lrange found 0 5
1) "wj"
2) "zs"
3) "fc"
4) "jy"
5) "yfd"
6) "gf"127.0.0.1:6380> rpush found ha
(integer) 7
127.0.0.1:6380> lrange found 0 6
1) "wj"
2) "zs"
3) "fc"
4) "jy"
5) "yfd"
6) "gf"
7) "ha"消费
127.0.0.1:6380> rpop found
"ha"
127.0.0.1:6380> lrange found 0 6
1) "wj"
2) "zs"
3) "fc"
4) "jy"
5) "yfd"
6) "gf"
127.0.0.1:6380> lpop found
"wj"
127.0.0.1:6380> lrange found 0 6
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
5) "gf"
127.0.0.1:6380> rpush found bao1 bao2 bao3 bao4
(integer) 9
127.0.0.1:6380> lrange found 0 10
1) "zs"
2) "fc"
3) "jy"
4) "yfd"
5) "gf"
6) "bao1"
7) "bao2"
8) "bao3"
9) "bao4"
127.0.0.1:6380> lpop found
"zs"
127.0.0.1:6380> lpop found
"fc"
127.0.0.1:6380> lpop found
"jy"
127.0.0.1:6380> lpop found
"yfd"
127.0.0.1:6380> lpop found
"gf"
127.0.0.1:6380> lpop found
"bao1"127.0.0.1:6380> lrange found 0 10
1) "bao2"
2) "bao3"
3) "bao4"
127.0.0.1:6380> LLEN found
(integer) 3
127.0.0.1:6380> rpush found bao1 bao2 bao3 bao4
(integer) 7
127.0.0.1:6380> lrange found 0 10
1) "bao2"
2) "bao3"
3) "bao4"
4) "bao1"
5) "bao2"
6) "bao3"
7) "bao4"
127.0.0.1:6380> lrem found 1 bao2
(integer) 1
127.0.0.1:6380> lrange found 0 10
1) "bao3"
2) "bao4"
3) "bao1"
4) "bao2"
5) "bao3"
6) "bao4"
127.0.0.1:6380> lset found 0 baozi001
OK
127.0.0.1:6380> lrange found 0 10
1) "baozi001"
2) "bao4"
3) "bao1"
4) "bao2"
5) "bao3"
6) "bao4"
redis 队列订阅
生产消费模型
消息模式
- 发布消息通常有两种模式:队列模式( queuIng)和发布-订阅模式(publish- subscribe)。队列模式中, consumers可以同时从服务端读取消息,每个消息只被其中一个 consume读到。
- 发布-订阅模式中消息被广播到所有的 consumer中, topic中的消息将被分发到组中的一个成员中。同一组中的 consumer可以在不同的程序中,也可以在不同的机器上。
Redis 发布订阅
- Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
- Redis客户端可以订阅任意数量的频道。
订阅发布实例
Redis 事务
- 开始事务
- 命令入队
- 执行事务
事务命令
数据备份
[root@cs7 ~]# redis-cli
127.0.0.1:6379> CONFIG GET dir # 获取当前目录
1) "dir"
2) "/var/lib/redis"
[root@cs7 ~]# ls /var/lib/redis/
dump.rdb
- Save备份(无持久化策略时),生成时在redis 当前目录中。
- 恢复时只需将 dump.rdb 放入redis当前目录
备份恢复实例
[root@mysql-56 redis6380]# egrep "port|daemon|dir|logfile|dbfilename" redis.conf
port 6380
daemonize yes
logfile "./redis.log"
dbfilename dump-6380.rdb
dir /data/redis6380
[root@mysql-56 redis6380]# tree
.
├── appendonly.aof
├── dump-6380.rdb
├── redis.conf
├── redis.log
└── redis-server
[root@mysql-56 redis6380]# ./redis-server redis.conf
[root@mysql-56 redis6380]# redis-cli -p 6380
127.0.0.1:6380> KEYS *
(empty list or set)
127.0.0.1:6380> mset name lewen age 24
OK
127.0.0.1:6380> SHUTDOWN
not connected> exit
[root@mysql-56 redis6380]# ls
appendonly.aof dump-6380.rdb redis.conf redis.log redis-server
[root@mysql-56 redis6380]# mv dump-6380.rdb /tmp/
[root@mysql-56 redis6380]# mv appendonly.aof /tmp/[root@mysql-56 redis6380]# ./redis-server redis.conf
[root@mysql-56 redis6380]# redis-cli -p 6380
127.0.0.1:6380> KEYS *
(empty list or set)
127.0.0.1:6380> SHUTDOWN
not connected>
[root@mysql-56 redis6380]# mv /tmp/dump-6380.rdb .
[root@mysql-56 redis6380]# ls
appendonly.aof dump-6380.rdb redis.conf redis.log redis-server
[root@mysql-56 redis6380]# ./redis-server redis.conf
[root@mysql-56 redis6380]# redis-cli -p 6380
127.0.0.1:6380> KEYS *
1) "age"
2) "name"
主从复制
主从配置
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=140,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=140,lag=1
master_replid:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6382> SLAVEOF 127.0.0.1 6380
OK127.0.0.1:6382> MGET name age
1) "lewen"
2) "24"
127.0.0.1:6381> SLAVEOF no one
Redis sentinel
Redis sentinel
功能
Sentinel 命令
配置
cp src/redis-sentinel sentinel.conf
vim sentinel.conf
port 26380
dir "."
sentinel monitor mcmaster 127.0.0.1 6381 1 # 主的个数,这里就写一个
sentinel down-after-milliseconds mymaster 60000
sentinel config-epoch mymaster O
#启动
./redis-sentinel /sentinel.conf
[root@mysql-56 s1]# cat sentinel.conf
port 26379
daemonize yes
pidfile "/var/run/redis-sentinel.pid"
logfile "./sentinel.log"
dir "/data/s1/"
sentinel myid 1c83d3230453094e2878f2f89dcd609ec601e380
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 6381 1
sentinel down-after-milliseconds mymaster 10000
sentinel config-epoch mymaster 1
配置文件
演示
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=9326,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=9326,lag=0
master_replid:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:9459
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:9459
127.0.0.1:6380> SHUTDOWN
not connected>[root@mysql-56 s1]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=11106,lag=0
master_replid:15dc060e31823a40c0e971733dc0add4c3e960f0
master_replid2:8b3a113a7708b59ec6da191eab8ddfa3a5ec2b92
master_repl_offset:11106
second_repl_offset:10006
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:11106
Redis cluster
Redis集群
Redis 集群数据共享
- Redis集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现:一个Redis集群包含16384个哈希槽( hash slot),数据库中的每个键都属于这16384个哈希槽的其中一个,集群使用公式CRC16(key)% 16384来计算键key属于哪个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。
- 节点A负责处理0号至5500号哈希槽。
- 节点B负责处理5501号至11000号哈希槽。
- 节点C负责处理11001号至16384号哈希槽
集群的复制
- 为了使得集群在一部分节点下线或者无法与集群的大多数(majority)节点进行通讯的情况下,仍然可以正常运作,Redis集群对节点使用了主从复制功能:集群中的每个节点都有1个至N个复制品(replicate),其中一个复制品为主节点(master),而其余的N-1个复制品为从节点(slave)。
- 在之前列举的节点A、B、C的例子中,如果节点B下线了,那么集群将无法正常运行,因为集群找不到节点来处理501号至11000号的哈希槽。
- 假如在创建集群的时候(或者至少在节点B下线之前),我们为主节点B添加了从节点B1,那么当主节点B下线的时候,集群就会捋B1设置为新的主节点,并让它代替下线的主节点B,继续处理5501号至11000号的哈希槽,这样集群就不会因为主节点B的下线而无法正常运作了。
- 不过如果节点B和B1都下线的话,Redis集群还是会停止运作。
运行机制
注意
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
创建多个实例
#!/bin/bash
rm -rf /data/700*
for no in {0..5}
domkdir /data/700$nocd /data/700$nocp -r /data/redis6380/* ./ sed -i "s/port 6379/port 700$no/g" redis.confsed -i "s/daemonize no/daemonize yes/g" redis.confsed -i "s#/var/log/redis/redis.log#redis.log#g" redis.conf# sed -i "s/dump.rdb/dump_700$no.rdb/g" redis.conf# sed -i "s/appendonly.aof/appendonly_700$no.aof/g" redis.confecho "cluster-enabled yes" >> redis.confecho "cluster-config-file nodes.conf" >> redis.confecho "cluster-node-timeout 5000" >> redis.confsed -i "s/appendonly no/appendonly yes/g" redis.confsed -i "s/redis_6379.pid/redis_700$no.pid/g" redis.confsed -i "/dir/d" redis.confecho 'dir "./"' >>redis.confdone
启动实例
#!/bin/bash
for i in `ss -lntp|grep 700|egrep 'pid=[0-9]{4}'|awk -F '=|,' '{print $3}'`;do kill -9 $i;done
for no in {0..5}
docd /data/700$no./redis-server ./redis.confdone
创建集群
[root@txy redis-6.0.9]# redis-cli -c -p 7000
127.0.0.1:7000> set name lewf
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> set name lewfd
OK
127.0.0.1:7001> set name lewfd
OK
127.0.0.1:7001> get name
"lewfd"
集群管理
增加新的节点
状态说明
- 集群最近一次向节点发送PING命合之后,过去了多长时间还没接到回复。
- 节点最近一次返回PONG回复的时间。
- 节点的配置纪元(configuration epoch):详细信息请参考Redis 集群规范。
- 本节点的网络连接情况:例如 connected。
- 节点目前包含的槽:例如 1270.0.1:7001 目前包含号码为5960至10921的哈希槽。
面试常问
redis qps
Redis 实战笔记相关推荐
- Redis学习笔记(实战篇)(自用)
Redis学习笔记(实战篇)(自用) 本文根据黑马程序员的课程资料与百度搜索的资料共同整理所得,仅用于学习使用,如有侵权,请联系删除 文章目录 Redis学习笔记(实战篇)(自用) 1.基于Sessi ...
- 腾讯、阿里、百度高工都点头称赞的“Redis 实战超全笔记”,不看你就亏大发了
写在开头 如何系统,全面,的学习redis呢? 我的一个程序员朋友,在之前有面试 Java 开发工程师岗位时,居然大部分的面试问题都是关于 Redis 的,他都差点都忘记了自己应聘的是 Java 工程 ...
- 黑马Redis学习笔记 (基础篇+实战篇)
目录 **一.初始Redis** **1.1SQL 和 NoSql的区别** **1.1.1结构化和非结构化** **1.1.2关联和非关联** **1.1.3查询方式** **1.1.4 事务** ...
- 极客时间 Redis核心技术与实战 笔记(基础篇)
Redis 概览 Redis 知识全景图 Redis 问题画像图 基础篇 基本架构 数据结构 数据类型和底层数据结构映射关系 全局哈希表 链式哈希解决哈希冲突 渐进式 rehash 不同数据结构查找操 ...
- Redis学习笔记②实战篇_黑马点评项目
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...
- 香饽饽:腾讯强推的Redis天花板笔记,帮助初学者快速入门和提高(核心笔记+面试高频解析)
前言 在目前的技术选型中,Redis 俨然已经成为了系统高性能缓存方案的事实标准,因此现在 Redis 也成为了后端开发的基本技能树之一. 基于上述情况,今天给大家分享一份我亲笔撰写的阿里内部< ...
- Redis学习笔记①基础篇_Redis快速入门
若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 资料链接:https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA( ...
- 一文搞懂百度强推的Redis天花板笔记,原来数据库是这样理解的
前言 在目前的技术选型中,Redis 俨然已经成为了系统高性能缓存方案的事实标准,因此现在 Redis 也成为了后端开发的基本技能树之一. 一键获取Redis文档 基于上述情况,今天给大家分享一份 我 ...
- Redis 学习笔记八:集群模式
Redis 学习笔记八:集群模式 作者:Grey 原文地址: 博客园:Redis 学习笔记八:集群模式 CSDN:Redis 学习笔记八:集群模式 前面提到的Redis 学习笔记七:主从复制和哨兵只能 ...
最新文章
- Nature封面:AI与人类斗嘴谁更强?IBM团队发布“AI辩论家”最新研究进展
- 网络营销——网络营销专员浅析如何合理设置网站关键词密度
- 两台笔记本怎么连接局域网
- CPU_X86架构和ARM架构入门篇
- linux e盘路径,Linux添加路径到PATH环境变量
- 洛谷P3919可持久化线段树
- android glide 版本,Android Studio 第六十七期 - Android Glide3.7.0和3.8.0用法
- 阿里巴巴宣布正自主研发AI芯片,性价比是同类产品40倍
- java中间件_uncode-mq 基于netty的轻量级java消息中间件
- Bitmap存储入门
- 禁用app里面的java_java – 我们可以禁用AOP调用吗?
- python暴力破解WiFi
- Spring Boot Admin配置安全验证
- 飞冰一个很不错的网站
- c语言日期加减天数,日期计算器
- 【数值计算】花式解线性方程组
- Topic 17. 临床预测模型之缺失值识别及可视化
- CSS 中 a 标签为什么不能继承父类的颜色?
- 洛谷 P1491 集合位置
- 中文字体压缩器——字蛛
热门文章
- 用java实现冒泡排序_Java实现冒泡排序
- mysql 换行_教你如何用Python 连接 MySQL
- 云计算比本地计算机可靠,1-云计算复习题
- was升级jdk版本_WebSphere 8.5 升级jdk版本
- 分享3个干货满满的Python实战项目,点赞收藏
- 两次深度debug经历,希望大家不要踩坑
- Python+Requests+Pytest+YAML+Allure实现接口自动化
- 十分钟用 Python 绘制了近十年编程语言趋势图
- postgresql 备份_等保涉及的PostgreSQL数据库
- 来自Android客户端什么意思,如何通过回调函数中的Node.js来自Android客户端