一:缓存概念:
缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如 CPU 的一级、二级缓存是保存了 CPU 最近经常访问的数据,内存是保存 CPU 经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的 raid 卡有也缓存,都是为了起到加速 CPU 访问硬盘数据的目的,因为 CPU 的速度太快了, CPU 需要的数据硬盘往往不能在短时间内满足 CPU 的需求,因此 PCU 缓存、内存、 Raid 卡以及硬盘缓存就在一定程度上满足了 CPU 的数据需求,即 CPU 从缓存读取数据可以大幅提高 CPU 的工作效率。
系统缓存
buffer与cache
buffer:缓冲也叫写缓冲,一般用于写操作,可以将数据先写入内存在写入磁盘 buffer 一般用于写缓冲,用于解决不同介质的速度不一致的缓冲,先将数据临时写入到里自己最近的地方,以提高写入速度,CPU会把数据先写到内存的磁盘缓冲区,然后就认为数据已经写入完成看,然后由内核在后续的时间再写入磁盘,所以服务器突然断电会丢失内存中的部分数据。
cache:缓存也叫读缓存,一般用于读操作 CPU 读文件从内存读,如果内存没有就先从硬盘读到内存再读到 CPU,将需要频繁读取的数据放在里自己最近的缓存区域,下次读取的时候即可快速读取。
Etag 标记
基于Etag 标记是否一致做判断页面是否发生过变化 ,比如基于Nginx的etag on来实现
下次请求会进行etag判断,如果etag没有变化,使用本地缓存。
CDN 缓存
CND,即内容分发网络(Content Delivery Network ),通过将服务内容分发至全网加速节点,利用全球调度系统使用户能够就近获取,有效降低访问延迟,提升服务可用性, CDN 第一降低机房的使用带宽,因为很多资源通过 CDN 就直接返回用户了,第二解决不同运营商之间的互联,因为可以让联通的网络访问联通让电信的网络访问电信,起到加速用户访问的目的, 第三:解决用户访问的地域问题,就近返回用户资源。
百度
CDN https://cloud.baidu. com/product/cdn.html
阿里
CDN https://www.aliyun.com/product/cdn?spm=5176.8269123.416540.50.728y8n
腾讯
CDN https://www.qclo ud.com/product/cdn
用户请求CDN流程:
提前对静态内容进行预缓存,避免大量的请求回源,导致主站网络带宽被打满而导致数据无法更新,另外 CDN 可以将数据根据访问的热度不同而进行不同 级别的缓存,例如访问量最高的资源访问 CDN边缘节点的内存,其次的放在 SSD 或者 SATA,再其次的放在云存储,这样兼顾了速度与成本。
CDN 主要优势:
提前对静态内容进行预缓存,避免大量的请求回源,导致主站网络带宽被打满而导致数据无法更新,另外CDN可以将数据根据访问的热度不同而进行不同级别的缓存,例如访问量最高的资源访问 CDN边缘节点的内存,其次的放在SSD或者SATA ,再其次的放在云存储,这样兼顾了速度与成本。缓存缓存到最快的地方如内存,缓存的数据准确命中率高,访问速度就快
- 调度准确-将用户调度到最近的边缘节点
- 性能优化-CDN专门用于缓存响应速度 快
- 安全相关-抵御攻击
- 节省带宽:由于用户请求由边缘节点响应 ,因此大幅降低到源站带宽。
应用层缓存:
Nginx、PHP等web服务可以设置应用缓存以加速响应用户请求另外有些解释性语言比如 PHP/Python不能直接运行,需要先编译成字节码,但字节码需要解释器解释为机器码之后才能 执行 ,因此字节码也是一种缓存,有时候会出现程序代码上线后字节码没有更新的现象。
其他层面缓存:
CPU缓存 (L1 的数据缓存和 L1 的指令缓存 、二级缓存、三级缓存磁盘)

磁盘缓存
RAID卡
分布式缓存: redis 、memcached
二:redis部署与使用:
redis 基础:
官网地址https://redis.io/
Redis和 Memcached 是非关系型数据库 也 称 为 N oSQL 数据库 MySQL 、 Mariadb 、 SQL S erver 、 PostgreSQL 、Oracle 数据库 属于关系型数据 RDBMS, Relational Database Management System
redis 简介
Redis (Remote Dictionary Server 在2009年发布开发者 Salvatore Sanfilippo 是意大利开发者他本想为自己的公司开发一个用于替换 MySQL 的产品 Redis 但是没有想到他把Redis 开源后大受欢迎,短短几年, Redis 就有了很大的用户群体,目前国内外使用的公司有知乎网 、新浪微博、 GitHub 等。redis是一个开源的、遵循 BSD 协议 的、基于内存的而且目前 比较流行的键值数据库 key value database是 一个非关系型数据库 redis 提供将内存通过网络远程共享的一种服务 ,提供类似功能的还有memcache,但相比相比memcache,,redisredis还提供了还提供了易扩展、高性能、具备数据持久性数据等功能。
RedisRedis在高并发、低延迟环境要求比较高的环境使用量非常在高并发、低延迟环境要求比较高的环境使用量非常广泛,目前目前redisredis在在DBDB–EEnginnginee月月排行榜排行榜https://dbhttps://db–engines.com/en/rankingengines.com/en/ranking 中一直比较靠前,而且一直是键值型存储类的首位。
redis对比memcached
- 支持数据的持久化:可以将内存中的数据保持在磁盘中,重启redis 服务或者服务器之后 可以从 备份文件中 恢复 数据到内存继续使用 。
- 支持更 多 的数据类型:支持 string 字符串 、 hash( 哈希 数据 、 list( 列表 、 set( 集合 、 ze t( 有序 集合支持数据的备份:可以实现 类似于 数据的 master slave 模式的数据备份,另外 也支持使用快照 +AOF 。
- 支持更大的 value 数据 memcache 单个 key value 最大只支持 1MB ,而 redis 最大 支持 512MB 。Redis 是单线程, 而 memcache 是多线程, 所以 单机 情况下没有 memcache 并发高, 但 redis 支持分布式 集群 以 实现更高的并发 单 Redis 实例可以实现数万并发。
- 支持集群横向扩展:基于 redis cluster 的 横向扩展,可以 实现 分布式集群,大幅提升性能和数据安 全性。
- 都是基于 C 语言 开发。
redis典型应用场景:
Session
共享:常见于web集群中的Tomcat或者PHP 中多 web服务器session 共享
消息队列:ELK 的日志 缓存、 部分业务的订阅发布 系统
计数器:访问排行榜 、商品 浏览数等和次数相关的数值统计场景
缓存:数据 查询、电商网站商品信息 、新闻内容
微博微信社交场合: 共同好友、点赞评论等
Redis 安装及使用:
官方下载地址: http://download.redis.io/releases/
yum 安装 redis
在centos 系统 上 需要安装 epel 源 。
查看 yum 仓库 redis 版本

安装 redis
# yum install redis -y
# systemctl start redis && systemctl enable redis
[root@redis s3 ~]# redis-cli
127.0.0.1:6379> info
# Server
re dis_version:3.2.12
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:7897e7d0e13773f
redis_mode:standalone
os:Linux 3.10.0 862.el7.x86_64 x86_64
arch_bits:64
编译安装 redis
下载当前最新 release 版本 redis 源码 包:
http://download.redis.io/releases/

编译安装命令:
官方的安装命令:https://redis.io/download
# pwd
/usr/local/src
# tar xf redis 5.0.3.tar.gz
# cd redis 5.0.3
# make PREFIX=/usr/local/redis install
# ll /usr/local/
total 0
drwxr xr x 2 root root 134 Dec 13 09:21 bin
前台启动 redis
解决 当前的警告 提示
tcp backlog
The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow. If a connection re quest arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.
backlog 参数控制的是 三次 握手 的 时候 server 端收到 client ack 确认 号 之后 的队列值 。
net.core.somaxconn = 512
vm.overcommit_memory
0、表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1、表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2、表示内核允许分配超过所有物理内存和交换空间总和的内存
vm.overcommit_memory = 1
transparent hugepage
开启大页 内存 动态分配 ,需要关闭让 redis 负责 内存管理。#此项需要写到/etc/rc.d/rc.local中,并赋予rc.local执行权限,使其每次开机自动运行。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# vim /etc/sysctl.conf
net.core.somaxconn = 512
vm.overcommit_memory = 1
# sysctl -p #使上述参数生效
编辑 redis 服务启动脚本
[root@s1 ~]# 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]
#在这里如果PIDFile记录不加,请不要使用systemd启动服务,佛则主从同步故障。
PIDFile=/apps/redis/run/redis_6379.pid #此记录必须同配置文件PID所在位置
# ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
创建redis管理用户和组:
# groupadd -g 992 redis && useradd -r -s /sbin/nologin -d /home/redis -u 992 -g redis redis
# mkdir /apps/redis/{etc,data,log,run}
# chmod -R redis.redis /apps/redis
# cp redis.conf /apps/redis/etc
# ln -sv /apps/redis/bin/* /usr/bin/
编译安装后的命令:
[root@master-redis ~]# ll /apps/redis/bin/
total 23348
-rwxr-xr-x 1 redis redis 2751920 Jun 14 11:35 redis-benchmark #性能检测工具
-rwxr-xr-x 1 redis redis 6077432 Jun 14 11:35 redis-check-aof #AOF文件检测工具
-rwxr-xr-x 1 redis redis 6077432 Jun 14 11:35 redis-check-rdb #RDB文件检测工具
-rwxr-xr-x 1 redis redis 2917960 Jun 14 11:35 redis-cli #客户端工具
lrwxrwxrwx 1 redis redis 12 Jun 14 11:35 redis-sentinel -> redis-server #哨兵软链接到server
-rwxr-xr-x 1 redis redis 6077432 Jun 14 11:35 redis-server #redis服务端
通常情况下启动时,使用命令+配置文件
# redis-server /apps/redis/etc/redis.conf
连接到Redis
主要分为运维人员的连接和程序的连接
本机非密码连接
# redis cli
跨主机非密码连接:
# redis-cli -h IP/HOSTNAME -p
跨主机密码连接 redis
# redis-cli -h IP/HOSTNAME -p PORT -a PASSWORD
python 连接方式:
#!/bin/env python
import redis
import time pool = redis.ConnectionPool(host="192.168.7.101", port=6379,password="") r = redis.Redis(connection_pool=pool)
for i in range(100):
r.set("k%d" % i,"v%d" % i)
time.sleep(1)
data=r.get("k%d" % i)
print(data)
redis 配置文件详解:
bind 127.0.0.1 #监听地址可以用空格隔开,跟多个监听IP
protected-mode yes #redis3.2之后加入的新特性,在没有设置密码的时候
#just允许远程访问
port 6379 #绑定端口
tcp-backlog 511 # 三次握手的时候server端收到client ack确认号之后的队列值。
timeout 0 #客户端和Redis服务端的连接超时时间,默认是0,表示永不超时。
tcp-keepalive 300 #tcp会话保持时间,每五分钟探测一次客户端时候存活
daemonize no #是否后台守护进程运行,开启yes,生成pid文件。
#仅生效于redis-server /apps/redis/etc/redis.conf启动时
supervised no #和操作系统相关参数,可以设置通过upstart和systemd
#管理Redis守护进程,centos 7以后都使用systemd。
pidfile /apps/reids/run/redis_6379.pid
#当开启daemonize yes,在此目录生成pid文件
loglevel notice #日志级别
logfile "/apps/redis/log/redis_6379.log" #日志存储位置和名称
databases 16 #数据库可打开库数量(0-15),可自定义,
#127.0.0.1:6379>select 1
always-show-logo yes # 在启动redis时是否显示log,方盒子图
save 900 1 #在900秒内,有一个键内容发生更改就启动快照机制
save 300 10
save 60 10000
stop-writes-on-bgsave-error no#no 当保存快照时,出现错误,允许用户继续写
#入数据。若为yes,则保存快照数据时,因为存储空间不足
#或者存储目录没有写权限,用户将无法继续写入数据
rdbcompression yes #是否启用快照数据压缩。
rdbchecksum yes #对快照数据进行校验
dbfilename dump.rdb #快照数据名称
dir /apps/redis/data/ #快照数据存储位置
slave-serve-stale-data yes #当从库同主库失去连接或者复制正在进行,从机库有两种运
#行方式: 1) 如果 replica serve stale data 设置为 yes( 默认设置 )),从库会
#继续响应客户端的 读 请求。 2) 如果 replicaserve stale data 设置为 no ,除
#去指定的命令之外的任何请求都会返回一个错误 "SYNC with master inprogress" 。
slave-read-only yes #从redisz只读,不允许写入
repl-diskless-sync no #是否使用socket方式复制数据,目前redis复制提供
#两种方式,disk 和 socket如果新的 slave 连上来或者重连的 slave无法部分同步,
#就会执行全量同步,master会生成rdb文件, 有2种方式: disk方式是master
#创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给 slave
#socket是master创建一个新的进程,直接把rdb文件以 socket的方式发给
#slave disk方式的时候,当一个 rdb保存的过程中,多个slave都能共享这个rdb
#文件, socket的方式就是一个个slave顺序复制,只有在磁盘速度缓慢但是网络
#相对较 快的情况下才 使 用 socket 方式, 否则使用 默认 的 disk方式
repl-diskless-sync-delay 30 #diskless复制的延迟时间,设置0为关闭,一旦复制开始还
#没有结束之前,master节点不会再接收新slave的复制请求,直到下一次开始
repl-ping-slave-period 10 #每10秒从服务器ping主一次,检测联通性
repl-timeout 60 #此数值要比repl-ping-slave-period大。默认60
repl-disable-tcp-nodelay no #此参数很少使用,
#在 socket 模式下是否在 slave 套接字发送 SYNC 之后禁用 TCP_NODELAY
#如果你选择“yes“,Redis将使用更少的TCP包和带宽来向slaves发送数据。但是这
#将使数据传输到slave上有延迟,Linux内核的默认配置会达到40毫秒,如果你选择
#了 "no" 数据传输到 salve 的延迟将会减少但要使用更多的带宽
repl-backlog-size 1mb #复制缓冲区大小,只有在slave连接上来才会分配
repl-backlog-ttl 3600 #多次时间每有slave连接,就清空backlog缓冲区
slave-priority 100 #当master不可用,Sentinel会根据slave的优先级选举一个master
#最低优先级的slave,当选master。配置为0,永不参选
requirepass redis #设置redis密码
rename-command CONFIG "" #重命令命令,相当于alias
maxclients 65536 #最大连接客户端
maxmemory <bytes> #最大内存,不要设置超过物理内存的一半,单位为bytes字节,
#8G内存的计算方式
#8(G)*1024(MB)*1024(KB)*1024Kbyte
#需要注意的是slave的输出缓冲区是不计算在maxmemory内
lazyfree-lazy-eviction no #针对redis内存使用达到maxmeory,并设置有淘汰策略
#时;在被动淘汰键时,是否采用lazy free机制;因为此场景开启lazy free, 可能使用
#淘汰键的内存释放不及时,导致redis内存超用,超过maxmemory的限制。此场景使用
#时,请结合业务测试。
lazyfree-lazy-expire no #针对设置有TTL的键,达到过期后,被redis清理删除时是否采
#用lazy free机制;此场景建议开启,因TTL本身是自适应调整的速度。
lazyfree-lazy-server-del no #针对有些指令在处理已存在的键时,会带有一个隐式的DEL
#键的操作。如rename命令,当目标键已存在,redis会先删除目标键,如果这些目标键是一
#个big key,那就会引入阻塞删除的性能问题。 此参数设置就是解决这类问题,建议可开启。
slave-lazy-flush no #针对slave进行全量数据同步,slave在加载master的RDB文件前,
#会运行flushall来清理自己的数据场景,参数设置决定是否采用异常flush机制。如果内
#存变动不大,建议可开启。可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的
#内存使用增长。
appendonly yes #是否开启AOF日志记录,默认redis使用的是rdb方式持久化,这种方
#式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢
#失,根据save来策略进行持久化,AppendOnlyFile是另一种持久化方式,可以提供更好
#的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启
#动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
appendfilename "appendonly.aof" #AOF日志存储位置,默认为dir定义下
appendfsync everysec ##aof持久化策略的配置no表示不执行fsync由操作系统保证数据
#同步到磁盘,always表示每次写入都执行fsync,以保证数据同步到磁盘,everysec表示
#每秒执行一次fsync,可能会导致丢失这1s数据。
no-appendfsync-on-rewrite no #在aofrewrite期间,是否对aof新记录的append暂缓
#使用文件同步策略,主要考虑磁盘IO开支和请求阻塞时间。默认为no,表示不暂缓,新的
#aof记录仍然会被立即同步Linux的,默认fsync策略是30秒,如果为yes可能丢失30秒数
#据,但由于yes性能较好,而且会避免出现阻塞因此比较推荐。
auto-aof-rewrite-percentage 100 #当Aoflog增长超过指定百分比例时,重写logfile设
#置为0,表示不自动重写Aof日志,重写是为了使aof体积保持最小,而确保保存最完整的数据。
auto-aof-rewrite-min-size 64mb #触发aofrewrite的最小文件大小
aof-load-truncated yes #否加载由于其他原因导致的末尾异常的AOF文件主进程被kill/断电等
aof-use-rdb-preamble yes #redis4.0新增RDBAOF混合持久化格式,在开启了这个功能之
#后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容
#用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,这样Redis就
#可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成重写文件,也能够在出现
#问题时,快速地载入数据)。
lua-time-limit 5000 #lua脚本的最大执行时间,单位为毫秒
cluster-enabled yes #是否开启集群模式,默认是单机模式
cluster-config-file nodes-6379.conf #由node节点自动生成的集群配置
cluster-node-timeout 15000 #集群中node节点连接超时时间
cluster-slave-validity-factor 10 #在执行故障转移的时候可能有些节点和master断
#开一段时间数据比较旧这些节点就不适用于选举为master超过这个时间的就不会被进行故障转移
cluster-migration-barrier 1 #一个主节点拥有的至少一个正常工作的从节点,即如果主节点的
#slave节点故障后会将多余的从节点分配到当前主节点成为其新的从节点。类似于热备盘
cluster-require-full-coverage no #集群槽位覆盖,如果一个主库宕机,且没有备库就
#会出现集群槽位不全,那么yes情况下redis集群槽位验证不全就不再对外提供服务,而no
#则可以继续使用,但是会出现查询数据查不到的情况,因为有数据丢失。
############################ SLOW LOG ###################################
#Slowlog是Redis用来记录查询执行时间的日志系统,slowlog保存在内存里面,读写速度非常
#快,因此你可以放心地使用它,不必担心因为开启slowlog而损害Redis的速度。
slowlog-log-slower-than 20000 #以微秒为单位的慢日志记录,为负数会禁用慢日志,
#为0会记录每个命令操作。
slowlog-max-len 128 #记录多少条慢日志保存在队列,超出后会删除最早的,以此滚动删除
#############################
127.0.0.1:6379> slowlog len
(integer) 14
127.0.0.1:6379> slowlog get
1) 1) (integer) 14
2) (integer) 1544690617
3) (integer) 4
4) 1) "slowlog"
127.0.0.1:6379> SLOWLOG reset
OK
##############################
latency-monitor-threshold 0
notify-keyspace-events ""
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 持久化:
redis虽然是一个内存级别的缓存程序,即 redis 是使用内存进行数据的缓存的,但是其可以将内存的数据按照一定的策略保存到硬盘上,从而实现数据持久保存的目的, redis 支持两种不同方式的数据持久化保存机制,分别是 RDB 和 AOF
RDB 模式
- RDB基于时间的快照, 只保留 当前最新的一次快照, 特点 是执行速度比较快,缺点 是可能 会丢失从上次快照到当 前 快照未完成之间的数据。
- RDB实现 的具体过程 R edis 从主进程先 fork 出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如 dump.rdb.temp ,当数据保存完成之后再将上一次保存的 RDB 文件替换掉,然后关闭子进程,这样可以保存每一次做 RDB 快照的时候保存的数据都是完整的,因为直接替换 RDB文件的时候可能会出现突然断电等问题而导致 RDB 文件还没有保存完整就突然关 机停止保存而导致数据丢失的情况,可以手动将每次生成的 RDB 文件进程备份,这样可以最大化保存历史数据。
- 当数据保存成功后,redis服务重启后,会自动读取快照数据,恢复到内存中。
RDB 模式的 优缺点:
优点:备份由子进程操作,在备份快照数据生成前,会临时在temp目录,生成后,移除原快照数据,移动生成的快照数据至指定目录。备份期间,后期用户写入的数据会在下一次触发快照数据备份时,进行备份,所以断电的话,丢失数据会较多
– RDB 快照 保存了某个时间点的数据,可以通过脚本执行 bgsave 非 阻塞 或者 save( 阻塞 命令自定义时间点北备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。
– 可以最大化 o 的性能,因为父进程在保存 RDB 文件的时候唯一要做的是 fork 出一个子进程,然后的操作都会有这个子进程操作,父进程无需任何的 IO
– 操作RDB在大量数据比如几个 G 的数据,恢 复的速度比 AOF 的快
缺点:
– 不能时时的保存数据,会丢失自上一次执行 RDB 备份到当前的内存数据
– 数据量非常大的时候,从父进程 fork 的时候需要一点时间,可能是毫秒或者秒
AOF 模式
- AOF:按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高,缺点是即使有些有些操作操作是重复的也会全部记录。等同于数据库binlog,row模式。
- AOF和RDB一样使用了写时复制机制,AOF默认为每秒钟fsync一次,即将执行的命令保存到AOF文件当中,这样即使redis服务器发生故障的话,顶多也就丢失1秒钟之内的数据,也可以设置不同的fsyncfsync策略,或者设置每次执行命令的时候执行策略fsync,fsync会在后台执行线程,所以主线程可以继续处理会在后台执行线程。
AOF 模式优缺点
AOF的文件大小要大于 RDB 格式的文件
根据所使用的fsync策略(fsync 是同步内存中redis所有已经修改的文件到存储设备),默认是appendfsync everysec,即每秒执行一次fsync。
redis数据
类型:http://www.redis.cn/topics/datatypes.html
字符串:string
字符串是所有编程语言中最常见的和最常用的数据类型,而且也是redis最基本的数据类型之一,而且redis中所有的key的类型都是字符串。
常用参数:(不区分大小写)
127.0.0.1:6379> set key1 value1
127.0.0.1:6379> get key1
127.0.0.1:6379> TYPE key1
127.0.0.1:6379> SET name2 jack2 ex 3 #设置自动过期时间
127.0.0.1:6379> DEL key1
127.0.0.1:6379> MSET key1 value1 key2 value2
127.0.0.1:6379> MGET key1 value1 key2 value2
127.0.0.1:6379> APPEND key1 append
127.0.0.1:6379> set num 10
127.0.0.1:6379> INCR num #增加数值
127.0.0.1:6379> DECR num #减少数值
127.0.0.1:6379> STRLEN key1 #返回字符长度
127.0.0.1:6379> FLUSHALL #清空所有数据
列表:list
列表是一个双向可读写的管道其头部是左侧尾部是右侧,一个列表最多可以包含2^321个元素即4294967295个元素。
127.0.0.1:6379> LPUSH list1 jack tom jhon #左插入数据
= jhon tom jack
127.0.0.1:6379> LPUSH list1 martin
= martin jhon tom jack
127.0.0.1:6379> RPUSH list1 andy
= martin jhon tom jack andy
127.0.0.1:6379> LLEN list1
(integer) 5
127.0.0.1:6379> RPOP list1 #读取并移除最后一个值
"andy"
127.0.0.1:6379> LLEN list1
(integer) 4
127.0.0.1:6379> LPOP list1 #读取并移除最后一个值
"martin"
127.0.0.1:6379> LLEN list1
(integer) 3
集合:set
Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
127.0.0.1:6379> SADD set1 v1 v2 v3
127.0.0.1:6379> SADD set2 v4 v5 v6
127.0.0.1:6379> TYPE set1
set
127.0.0.1:6379> SADD set1 v1
(integer) 0 #如果当前set集合里有值v1,则添加值失败,此0为失败添加,未成功
127.0.0.1:6379> SADD set1 v4
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "v4"
2) "v3"
3) "v2"
4) "v1"
127.0.0.1:6379> SMEMBERS set2
1) "v6"
2) "v5"
3) "v4"
差集:已属于A而不属于B的元素称为A与B的差(集)
127.0.0.1:6379> SDIFF set1 set2
1) "v1"
2) "v3"
3) "v2"
127.0.0.1:6379> SDIFF set2 set1 #A与B的差
1) "v5"
2) "v6"
127.0.0.1:6379> SINTER set1 set2 #交集
1) "v4"
127.0.0.1:6379> SUNION set1 set2 #联合
1) "v2"
2) "v4"
3) "v1"
4) "v3"
5) "v6"
6) "v5"
有序集合:sorted set
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double双精度浮点型类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的但分数(却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)集合中最大的成员数为2321(4294967295,每个集合可存储40多亿个成员。
127.0.0.1:6379> ZADD paihangbang 10 key1 20 key2 30 key3
127.0.0.1:6379> ZRANGE paihangbang 0 -1 withscores #显示所有
1) "key1"
2) "10"
3) "key2"
4) "20"
5) "key3"
6) "30"
127.0.0.1:6379> ZCARD paihangbang #获取集合的长度
127.0.0.1:6379> ZRANK paihangbang key3 #返回key3值的索引号,索引号从0开始
(integer) 2
哈希:hash
hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,Redis中每个hash可以存储2321键值对(40多亿)。
127.0.0.1:6379> HSET hset1 name martin age 18 #生成hash key
(integer) 2
127.0.0.1:6379> HGET hset1 name #获取hash key字段值
"martin"
127.0.0.1:6379> HGET hset1 age
"18"
127.0.0.1:6379> HKEYS hset1 #获取所有hash表中的字段
1) "name"
2) "age"
127.0.0.1:6379> HDEL hset1 age #删除表中字段
127.0.0.1:6379> HKEYS hset1
1) "name"
消息队列
消息队列主要分为两种,分别是生产者消费者模式和发布者订阅者模式,这两种模式Redis都支持。
生产者 消费者模式:
在生产者消费者Producer/Consumer模式下,上层应用接收到的外部请求后开始处理其当前步骤的操作,在执行完成后将已经完成的操作发送至指定的频道channel当中,并由其下层的应用监听该频道并继续下一步的操作,如果其处理完成后没有下一步的操作就直接返回数据给外部请求,如果还有下一步的操作就再将任务发布到另外一个频道,由另外一个消费者继续监听和处理。
模式介绍
生产者消费者模式下,多个消费者同时监听一个队里,但是一个消息只能被最先抢到消息的消费者消费即消息任务是一次性读取和处理此模式在分布式业务架构中非常常用比较常用的软件还有RabbitMQ、Kafka、RocketMQ、ActiveMQ等

队列介绍
队列当中的消息由不同的生产者写入也会有不同的消费者取出进行消费处理,但是一个消息一定是只能被取出一次也就是被消费一次。

127.0.0.1:6379> LPUSH channel1 msg1 #从管道的左侧写入
(integer) 1
127.0.0.1:6379> LPUSH channel1 msg2
(integer) 2
127.0.0.1:6379> LPUSH channel1 msg3
(integer) 3
127.0.0.1:6379> LPUSH channel1 msg4
(integer) 4
127.0.0.1:6379> LPUSH channel1 msg5
(integer) 5
127.0.0.1:6379> LRANGE channel1 0 -1 #查看队列消息
1) "msg5"
2) "msg4"
3) "msg3"
4) "msg2"
5) "msg1"
127.0.0.1:6379> RPOP channel1 #从管道的右侧消费
"msg1"
127.0.0.1:6379> RPOP channel1
"msg2"
127.0.0.1:6379> RPOP channel1
"msg3"
127.0.0.1:6379> RPOP channel1
"msg4"
127.0.0.1:6379
> RPOP channel1
"msg5"
127.0.0.1:6379> RPOP channel1
(nil)
127.0.0.1:6379> LRANGE channel1 0 -1 #再次验证队列消息
(empty list or set)
发布者订阅模式:
模式简介:
在发布者订阅者模式下,发布者将消息发布到指定的channel里面凡是监听该channel的消费者
都会收到同样的一份消息,这种模式类似于是收音机模式,即凡是收听某个频道的听众都会收到主持人发布的相同的消息内容。
– 此模式常用语群聊天、群通知、群公告等场景。
1. Subscriber:订阅者
2. Publisher发布者
3. Channel频道

127.0.0.1:6379> SUBSCRIBE channel1 #订阅者订阅指定
Reading messages... (press CtrlC to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
127.0.0.1:6379> PUBLISH channel1 hello #发布者发布消息
(integer) 2
127.0.0.1:6379> PUBLISH channel1 world
(integer) 2
127.0.0.1:6379> SUBSCRIBE channel1 #订阅者验证消息
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) **"hello"**
1) "message"
2) "channel1"
3) **"world"**
127.0.0.1:6379> SUBSCRIBE channel1 channel2 #订阅多个频道
127.0.0.1:6379> PSUBSCRIBE *
127.0.0.1:6379> PSUBSCRIBE chan*
redis其他命令:
CONFIG:用于查看当前redis配置、以及不重启更改redis配置等。
127.0.0.1:6379> CONFIG GET bind
127.0.0.1:6379> CONFIG GET bind|* #查看当前bind配置或所有配置
1) "bind"
2) "127.0.0.1 172.16.36.50"
127.0.0.1:6379> CONFIG SET requirepass 123456 #临时修改密码,重启服务失效
INFO:显示当前节点redis运行状态信息。*显示当前节点redis运行状态信息。
127.0.0.1:6379> INFO

SELECT:切换数据库。
127.0.0.1:6379> SELECT 15

keys:查看当前库下的所有key
127.0.0.1:6379> KEYS *

BGSAVE:手动在后台执行RDB持久化操作
127.0.0.1:6379> BGSAVE

DBSIZE:返回当前库下的所有key数量
127.0.0.1:6379> DBSIZE

FLUSHDB:强制清空当前库中的所有key
127.0.0.1:6379> FLUSHDB

FLUSHALL:强制清空当前redis服务器所有数据库中的所有key即删除所有数据
127.0.0.1:6379> FLUSHALL
