揭阳模板网站建站,怎么做私人彩票网站,苏州企业网站建设公司价格,网站开发域名第一章 Redis入门 1.1 节 什么是NoSql型数据库 NoSQL ,泛指非关系型的数据库, NoSQL Not Only SQL,它可以作为关系型数据库的良好补充。 NoSQL 不依赖业务逻辑方式存储#xff0c;而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。NoSQL与SQL数据库区别对比如…第一章 Redis入门 1.1 节 什么是NoSql型数据库 NoSQL ,泛指非关系型的数据库, NoSQL Not Only SQL,它可以作为关系型数据库的良好补充。 NoSQL 不依赖业务逻辑方式存储而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。NoSQL与SQL数据库区别对比如下
SQLNoSQL数据结构结构化非结构化数据关联关联的无关联的查询方式SQL查询非SQL查询事务特征ACIDBASE存储方式磁盘内存扩展性垂直水平使用场景数据结构固定相关业务对数据安全性、一致性要求较高数据结构不固定对一致性安全性要求不高对性能要求高
常见NoSQL数据库 Reids 键值对 MongoDB文档类型 HBase (列类型) Neo4j(Graph类型)
1.2 节 Reids介绍
Redis诞生于2009年全称是Remote Dictionary Server远程词典服务器是一个基于内存的键值型NoSQL数据库。其主要特征如下 键值key-value型value支持多种不同数据结构功能丰富 单线程每个命令具备原子性 低延迟速度快基于内存、IO多路复用、良好的编码) 支持数据持久化 支持主从集群、分片集群 支持多语言客户端
1.3 节 Reids 安装
需要的文件
链接https://pan.baidu.com/s/10o9t5OOX2A4s98vnFnJwmA?pwdrxtc 提取码rxtc
基于Linux服务器来部署项目
1.4.1 Redis安装
【1】依赖库Redis是基于C语言编写的因此首先需要安装Redis所需要的gcc依赖
yum install -y gcc tcl
【2】上传安装包并解压然后将资料提供的Redis安装包上传到虚拟机的/usr/local/目录
【3】解压缩
tar -xzf redis-6.2.6.tar.gz
【4】进入redis目录
cd redis-6.2.6
【5】运行编译命令
make make install
默认的安装路径是在 /usr/local/bin目录下该目录已经默认配置到环境变量因此可以在任意目录下运行这些命令。其中 redis-cli是redis提供的命令行客户端 redis-server是redis的服务端启动脚本 redis-sentinel是redis的哨兵启动脚本
redis的启动方式有很多种例如 默认启动 指定配置启动 开机自启
1.4.2 默认启动
安装完成后在任意目录输入redis-server命令即可启动Redis
redis-server
这种启动属于前台启动会阻塞整个会话窗口窗口关闭或者按下CTRL C则Redis停止。不推荐使用。
1.4.3 指定配置启动
如果要让Redis以后台方式启动则必须修改Redis配置文件就在我们之前解压的redis安装包下/usr/local/redis-6.2.6名字叫redis.conf
我们先将这个配置文件备份一份
cp redis.conf redis.conf.bck
修改redis.conf文件中的一些配置
# 允许访问的地址默认是127.0.0.1会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问生产环境不要设置为0.0.0.0
bind 0.0.0.0
# 守护进程修改为yes后即可后台运行
daemonize yes
# 密码设置后访问Redis必须输入密码
# requirepass 123456
Redis的其它常见配置
# 监听的端口
port 6379
# 工作目录默认是当前目录也就是运行redis-server时的命令日志、持久化等文件会保存在这个目录
dir .
# 数据库数量设置为1代表只使用1个库默认有16个库编号0~15
databases 16
# 设置redis能够使用的最大内存
maxmemory 512mb
# 日志文件默认为空不记录日志可以指定日志文件名
logfile redis.log
启动Redis
# 进入redis安装目录
cd /usr/local/redis-6.2.6
# 启动
redis-server redis.conf
停止服务
# 利用redis-cli来执行 shutdown 命令即可停止 Redis 服务
# 因为之前配置了密码因此需要通过 -u 来指定密码
redis-cli -u 123456 shutdown
1.4.4 开机自启
我们也可以通过配置来实现开机自启。
首先新建一个系统服务文件
vi /etc/systemd/system/redis.service
内容如下
[Unit]
Descriptionredis-server
Afternetwork.target[Service]
Typeforking
ExecStart/usr/local/bin/redis-server /usr/local/redis-6.2.6/redis.conf
PrivateTmptrue[Install]
WantedBymulti-user.target
然后重载系统服务
systemctl daemon-reload
现在我们可以用下面这组命令来操作redis了
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis
执行下面的命令可以让redis开机自启
systemctl enable redis
1.5 节 Redis 基于Docker安装
【1】下载镜像
docker pull redis:6.2.6
【2】运行容器
docker run --name redis -d -p 6379:6379 redis:6.2.6
1.6 节 Redis桌面客户端
安装完成Redis我们就可以操作Redis实现数据的CRUD了。这需要用到Redis客户端包括 命令行客户端 图形化桌面客户端 编程客户端
1.6.1 Redis命令行客户端
Redis安装完成后就自带了命令行客户端redis-cli
redis-cli [options] [commonds]
其中常见的options有 -h 127.0.0.1指定要连接的redis节点的IP地址默认是127.0.0.1 -p 6379指定要连接的redis节点的端口默认是6379 -a 123456指定redis的访问密码
其中的commonds就是Redis的操作命令例如 ping与redis服务端做心跳测试服务端正常会返回pong
不指定commond时会进入redis-cli的交互控制台
1.6.2 图形化桌面客户端
【1】在资料中可以找到Redis的图形化桌面客户端
【2】解压缩后运行安装程序即可安装
【3】安装完成后在安装目录下找到rdm.exe文件
【4】建立连接点击左上角的连接到Redis服务器按钮
【5】在弹出的窗口中填写Redis服务信息 Redis默认有16个仓库编号从0至15. 通过配置文件可以设置仓库数量但是不超过16并且不能自定义仓库名称。如果是基于redis-cli连接Redis服务可以通过select命令来选择数据库
# 选择 0号库
select 0
第二章 Redis基本知识
2.1 节 Reids 多路复用
在Redis6/7中非常受关注的第一个新特性就是多线程。
这是因为Redis一直被大家熟知的就是它的单线程架构Redis6以前是单线程架构虽然有些命令操作可以用后台线程或子进程执行比如数据删除、快照生成、AOF重写。但是从网络IO处理到实际的读写命令处理都是由单个线程完成的。
随着网络硬件的性能提升Redis的性能瓶颈有时会出现在网络IO的处理上也就是说单个主线程处理网络请求的速度跟不上底层网络硬件的速度,
为了应对这个问题:
采用多个IO线程来处理网络请求提高网络请求处理的并行度Redis6/7就是采用的这种方法。
但是Redis的多线程只是用来处理网络请求的对于读写操作命令Redis仍然使用单线程来处理。这是因为Redis处理请求时网络处理经常是瓶颈通过多个IO线程并行处理网络操作可以提升实例的整体处理性能。而继续使用单线程执行命令操作就不用为了保证Lua脚本、事务的原子性额外开发多线程互斥加锁机制了(不管加锁操作处理)这样一来Redis线程模型实现就简单了
2.2 节 Redis 默认16 库
Redis是一个字典结构的存储服务器一个Redis实例提供了多个用来存储数据的字典客户端可以指定将数据存储在哪个字典中。 这与在一个关系数据库实例中可以创建多个数据库类似如下图所示所以可以将其中的每个字典都理解成一个独立的数据库。
Redis默认支持16个数据库可以通过调整Redis的配置文件redis/redis.conf中的databases来修改这一个值设置完毕后重启Redis便完成配置。 2.2.1 切换数据库
语法结构
select number
示例
127.0.0.1:6379 set k1 v1
OK
127.0.0.1:6379 get k1
v1
# 切换数据库获取不到k1数据
127.0.0.1:6379 select 1
OK
127.0.0.1:6379[1] get k1
(nil)
2.2.2 清空当前库
Redis Flushdb 命令用于清空当前数据库中的所有 key。
语法结构
127.0.0.1:6379 FLUSHDB
2.2.3 通杀全部库
Redis Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key )。
语法结构
redis 127.0.0.1:6379 FLUSHALL
2.3 节 Redis数据类型_key键
2.3.1 keys
查看当前库中所有的key 。
语法结构
keys *
有3个通配符 *, ? ,[] *: 通配任意多个字符 ?: 通配单个字符 []: 通配括号内的某1个字符
注意 生产已经禁止。因为长时间阻塞redis而导致其他客户端的命令请求一直处于阻塞状态。 更安全的做法是采用scan。
新版本也进行了替代
redis-cli -h 127.0.0.1 -p 6379 -a 123456 --scan *
2.3.2 exists
判断某个key是否存在返回1表示存在0不存在。
语法结构
exists key
#查看k1是否存在如果存在返回1
exists k1
# 查看k1 k2 k3是否存在如果k1 k2存在k3不存在则返回2
exists k1 k2 k3
注意 可以设置多个key只返回存在的个数但不返回哪一个存在/不存在。
2.3.3 type
查看当前key 所储存的值的类型。返回当前key所储存的值的类型 如string 、list等。
语法结构
type key
2.3.3 del
删除已存在的key不存在的 key 会被忽略。
语法结构
del key
示例
可以设置多个key返回删除成功的个数。
# 删除k1如果成功返回1失败返回0
del k1
# 删除k1 k2 k3如果k1 k2存在k3不存在则返回2
del k1 k2 k3
2.3.4 expire
给key设置time秒的过期时间。设置成功返回 1 。 当 key 不存在返回 0。
语法结构
expire key time
示例
# 给k1设置10秒后过期
expire k1 10
2.3.4 ttl
以秒为单位返回 key 的剩余过期时间。
语法结构
ttl key
注意 当 key 不存在时返回 -2 。 当 key 存在但没有设置剩余生存时间时返回 -1 。 否则以秒为单位返回 key 的剩余生存时间。
2.3.5 persist
移除给定 key 的过期时间使得 key 永不过期。
语法结构
persist key
注意 当过期时间移除成功时返回 1 。 如果 key 不存在或 key 没有设置过期时间返回 0 。
第三章 Redis 数据类型
3.1 节 String
3.1.1 简介
String是Redis最基本的类型一个key对应一个value。String是二进制安全的意味着String可以包含任何数据比如序列化对象或者一张图片。String最多可以放512M的数据。
3.1.2 常用命令
【1】set
用于设置给定 key 的值。如果 key 已经存储其他值 set 就重写旧值且无视类型。
语法格式
set key value
【2】get
用于获取指定 key 的值。如果 key 不存在返回 nil 。
语法格式
get key
【3】append
将给定的value追加到key的值的末尾。
语法格式:
append key value
注意 如果 key 已经存在并且是一个字符串 append 命令将 value 追加到 key 原来的值的末尾。 如果 key 不存在 append 就简单地将给定 key 设为 value 就像执行 set key value 一样。
【4】strlen
获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时返回一个错误。
语法格式
strlen key
【5】setex
给指定的 key 设置值及time 秒的过期时间。如果 key 已经存在 setex命令将会替换旧的值并设置过期时间。
语法格式
setex key time value
【6】setnx
只有在key不存在时设置key的值
语法格式
setnx key value
【7】getrange
获取指定区间范围内的值类似between........and 的关系下标的起始与结束
语法格式
getrange key start end
【8】setrange
设置指定区间范围内的值类似between........and 的关系下标的起始与结束
语法结构
setrange key offset value
【9】incr
将 key 中储存的数字值增一。
语法格式
incr key
注意 如果 key 不存在那么 key 的值会先被初始化为 0 然后再执行 incr 操作。 如字符串类型的值不能表示为数字、或者是其他类型那么返回一个错误。
【10】decr
将 key 中储存的数字值减一。
语法格式
decr key 注意
如果 key 不存在那么 key 的值会先被初始化为 0 然后再执行 decr 操作。 如字符串类型的值不能表示为数字、或者是其他类型那么返回一个错误。
【11】incrby/decrby key step
将key存储的数字值按照step进行增减。
语法格式
incrby/decrby key 步长
注意
如果 key 不存在那么 key 的值会先被初始化为 0 然后再执行 incrby/decrby 命令。 如字符串类型的值不能表示为数字、或者是其他类型那么返回一个错误。
【12】mset
同时设置一个或多个 key-value
语法格式
mset key1 value1 key2 value2
【13】mget
返回所有(一个或多个)给定 key 的值。
语法格式
mget key1 key2
【14】getset
将给定key值设为value并返回key的旧值old value简单一句话先get然后立即set。
语法格式
getset key value
3.1.3 使用场景
value 除了是字符串以外还可以是数字。 计数器 统计多单位的数量 粉丝数 对象缓存存储 分布式锁
3.2 节 List
3.2.1 简介
List是简单的字符串列表按照插入顺序排序。你可以添加一个元素到列表的头部左边或者尾部右边。底层是一个双向链表 对两端操作性能极高通过索引操作中间的节点性能较差。
一个List最多可以包含 $2^{32}-1$个元素 每个列表超过40亿个元素。
3.2.2 常用命令
【1】lpush/rpush
从左边头部/右边尾部插入一个或多个值。
语法结构
lpush/rpush key1 value1 value2 value3……
示例
#从左边放入v1 v2 v3
127.0.0.1:6379 lpush k1 v1 v2 v3
(integer) 3
【2】lrange
返回key列表中的start和end之间的元素包含start和end。 其中 0 表示列表的第一个元素-1表示最后一个元素。
语法结构
lrange key start end
示例
#取出列表里前3个值结果为v3 v2 v1
127.0.0.1:6379 lrange k1 0 2
#取出列表里全部值结果为v3 v2 v1 v4 v5 v6
127.0.0.1:6379 lrange k1 0 -1
【3】lpop/rpop
移除并返回第一个值或最后一个值。
语法格式
lpop/rpop key
示例
# lpop k1 从列表中删除v3并返回当前列表全部值v2 v1 v4 v5 v6
127.0.0.1:6379 lpop k1
v3# rpop k1 从列表中删除v6并返回当前列表全部值v2 v1 v4 v5
127.0.0.1:6379 rpop k1
v6 注意 值在键在值光键亡 【4】lindex
获取列表index位置的值(从左开始)。
语法结构
lindex key index
【5】llen
获取列表长度。
语法结构
llen key
【6】lrem
从左边开始删除与value相同的count个元素。
语法结构
lrem key count value
示例
#从左边开始删除k1列表中2个v1元素
lrem k1 2 v1
【7】linsert
在列表中value值的前边/后边插入一个new value值从左开始。
语法结构
linsert key before/after value newvalue
示例
# 在v1前面插入一个v5
linsert k1 before v1 v5
【8】lset
将索引为index的值设置为value
语法结构
lset key index value
3.2.3 使用场景 消息队列 排行榜 最新列表
3.3 节 Set
3.3.1 简介
与List类似是一个列表功能但Set是自动去重的当需要存储一个列表数据又不希望出现重复数据时Set是一个很好的选择。 Set是String类型的无序集合它底层其实是一个value为null的hash表所以添加、删除、查找的时间复杂度都是O(1)。
【1】sadd
将一个或多个元素添加到集合key中已经存在的元素将被忽略。
语法结构
sadd key value1 value2……
【2】smembers
取出该集合的所有元素。
语法结构
smembers key
【3】sismember
判断集合key中是否含有value元素如有返回1否则返回0。
语法结构
sismember key value
【4】scard
返回该集合的元素个数。
语法结构
scard key
【5】srem
删除集合中的一个或多个成员元素不存在的成员元素会被忽略。
语法结构
srem key value1 value2……
【6】spop
随机删除集合中一个元素并返回该元素。
语法结构
spop key
【7】srandmember
随机取出集合中count个元素但不会删除。
语法结构
srandmember key count
【8】smove
将value元素从sourcekey集合移动到destinationkey集合中。
语法结构
smove sourcekey destinationkey value
注意
如果 sourcekey集合不存在或不包含指定的 value元素则smove 命令不执行任何操作仅返回 0 。
【9】sinter
返回两个集合的交集元素。
语法结构
sinter key1 key2
【10】sunion
返回两个集合的并集元素。
语法结构
sunion key1 key2
【11】sdiff
返回两个集合的差集元素key1中的不包含key2
语法结构
sdiff key1 key2
3.3.3 使用场景 黑白名单 随机展示 好友 关注人 粉丝 感兴趣的人集合
3.4 节 Hash
3.4.2 常用命令
【1】hset
给key集合中的field赋值value。
语法结构
hset key field value
注意
如果哈希表不存在一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中旧值将被重写。
【2】hget
从key哈希中取出field字段的值。
语法结构
hget key field
【3】hmset
批量设置哈希的字段及值。
语法结构
hmset key field1 value1 field2 value2……
【4】hexists
判断指定key中是否存在field
语法结构
hexists key field
【5】hkeys
获取该哈希中所有的field。
语法结构
hkeys key
【6】hvals key
获取该哈希中所有的value。
语法结构
hvals key
【7】hincrby
为哈希表key中的field字段的值加上增量increment。
语法结构:
hincrby key field increment 注意 增量也可以为负数相当于对指定字段进行减法操作。 如果哈希表的 key 不存在一个新的哈希表被创建并执行 hincrby 命令。 如果指定的字段不存在那么在执行命令前字段的值被初始化为 0 。 对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。 【8】hdel
删除哈希表 key 中的一个或多个指定字段不存在的字段将被忽略。
语法结构
hdel key field1 field2……
【9】hsetnx
给key哈希表中不存在的的字段赋值 。
语法结构:
hsetnx key field value
3.4.3 使用场景 购物车 存储对象
3.5 节 Zset
3.5.1 简介
Zset与Set非常相似是一个没有重复元素的String集合。不同之处是Zset的每个元素都关联了一个分数score这个分数被用来按照从低分到高分的方式排序集合中的元素。集合的元素是唯一的 但分数可以重复。有顺序的Set
注意
因为元素是有序的所以可以根据分数score或者次序position来获取一个范围内的元素。
3.5.2 常用命令
【1】zadd
将一个或多个元素value及分数score加入到有序集key中。
语法结构
zadd key score1 value1 score2 value2……
示例
zadd k1 100 java 200 c 300 python 400 php 注意 如果某个元素已经是有序集的元素那么更新这个元素的分数值并通过重新插入这个元素来保证该元素在正确的位置上。 分数值可以是整数值或双精度浮点数。 如果有序集合 key 不存在则创建一个空的有序集并执行 zadd 操作。 【2】zrange
返回key集合中的索引start和索引end之间的元素包含start和end。
语法结构
zrange key start end [withscores]
示例
zrange k1 0 -1 返回集合中所有元素
zrange k1 0 -1 withscores 返回集合中所有元素并携带元素分数 注意 其中元素的位置按分数值递增(从小到大)来排序。 其中 0 表示列表的第一个元素-1表示最后一个元素。 withscores是可选参数是否返回分数。 【3】zrangebyscore
返回key集合中的分数minscore 和分数maxscore 之间的元素包含minscore 和maxscore 。其中元素的位置按分数值递增(从小到大)来排序。
语法结构
zrangebyscore key minscore maxscore [withscores]
示例
zrangebyscore k1 200 400 返回200-400分之间的元素递增排序 【4】zincrby
为元素value的score加上increment的值。
语法结构
zincrby key increment value
示例
zincrby k1 50 java 给java元素加上50分 【5】zrem
删除该集合下value的元素。
语法结构
zrem k1 php 删除php 【6】zcount
统计该集合在minscore 到maxscore分数区间中元素的个数。
语法结构
zcount key minscore maxscore
示例
zcount k1 100 300 统计100分到300分中间元素的个数 【7】zrank
返回value在集合中的排名从0开始。
语法结构
zrank key value
示例
zrank k1 c 返回c排名 3.5.3 使用场景 延时队列 排行榜 限流 3.6 节 Bitmaps
3.6.1 简介
在计算机中用二进制位作为存储信息的基本单位1个字节等于8位。
例如 abc 字符串是由 3 个字节组成计算机存储时使用其二进制表示abc分别对应的ASCII码是97、98、99对应的二进制是01100001、01100010、01100011在内存中表示如下 3.6.2 常用命令
【1】setbit
设置Bitmaps中某个偏移量的值。
语法结构
setbit key offset value
示例 记录张三 1月份上班打卡情况
127.0.0.1:6379 setbit zhangsan:1 0 1
(integer) 0
127.0.0.1:6379 setbit zhangsan:1 1 1
(integer) 0
127.0.0.1:6379 setbit zhangsan:1 2 1
(integer) 0
127.0.0.1:6379 setbit zhangsan:1 3 0
(integer) 0
127.0.0.1:6379 setbit zhangsan:1 4 1
(integer) 0
127.0.0.1:6379 setbit zhangsan:1 5 1
(integer) 0
127.0.0.1:6379 setbit zhangsan:1 6 0
(integer) 0【2】getbit
获取Bitmaps中某个偏移量的值。
语法结构
getbit key offset
示例
查看张三1月份 第三天、第四天是否上班
127.0.0.1:6379 getbit zhangsan:1 2
(integer) 1
127.0.0.1:6379 getbit zhangsan:1 3
(integer) 0
【3】bitcount
统计字符串被设置为1的bit数量。一般情况下给定的整个字符串都会被进行统计可以选择通过额外的start和end参数指定字节组范围内进行统计包括start和end0表示第一个元素-1表示最后一个元素。
语法结构
bitcount key [start end]
示例统计张三上班天数
127.0.0.1:6379 bitcount zhangsan:1
(integer) 5 【4】bitop
将多个bitmaps通过求交集/并集方式合并成一个新的bitmaps。
语法结构
bitop and/or destkey sourcekey1 sourcekey2……
示例
bitop and k3 k1 k2 通过求交集将k1 k2合并成k3
bitop or k3 k1 k2 通过求并集将k1 k2合并成k33.6.3 使用场景 活跃天数 打卡天数 登录天数 用户签到 统计活跃用户 统计用户是否在线 实现布隆过滤器
3.7 节 Geospatial
3.7.1 简介
GEOGeographic,地理信息的缩写。该类型就是元素的二维坐标在地图上就是经纬度。Redis基于该类型提供了经纬度设置、查询、范围查询、距离查询、经纬度Hash等常见操作。
3.7.2 常用命令
【1】geoadd
用于存储指定的地理空间位置可以将一个或多个经度 (longitude)、纬度(latitude)、位置名称(member)添加到指定的 key中。
语法结构
geoadd key longitude latitude member
示例
# 将北京的经纬度和名称添加到china
geoadd china 116.405285 39.904989 beijing
# 将成都和上海的经纬度、名称添加到china
geoadd china 104.065735 30.659462 chengdu 121.472644 31.231706 shanghai 【2】geopos
从给定的 key 里返回所有指定名称(member)的位置经度和纬度不存在的返回 nil。
语法结构
geopos key member [member ……]
示例
返回china中名称为shanghai和beijing的经纬度
geopos china shanghai beijing【3】geodist
用于返回两个给定位置之间的距离。
语法结构
geodist key member1 member2 [m|km|ft|mi] 参数说明 m 米默认单位。 km 千米。 mi 英里。 ft 英尺。 示例
# 返回shanghai和beijing之间的距离结果1067597.9668单位米
geodist china shanghai beijing
# 返回shanghai和chengdu之间的距离结果1660.0198单位是千米
geodist china shanghai beijing km【4】georadius
以给定的经纬度longitude latitude为中心 返回键包含的位置元素当中 与中心的距离不超过给定最大距离radius 的所有位置元素。
语法结构
georadius key longitude latitude radius m|km|ft|mi
示例
#获取经纬度110 30为中心在china内1200公里范围内的所有元素。
georadius china 110 30 1200 km3.7.3 使用场景 附近的电影院 附近的好友 离最近的火锅店
3.8 节 HyperLogLog
3.8.1 简介
在我们做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量page view)。redis HyperLogLog是用来做基数统计的算法HyperLogLog的优点是在输入元素的数量或者体积非常非常大时计算基数所需的空间总是固定的、并且使很小的。
什么是基数
比如数据集{1,3,5,7,5,7,8}那么这个数据集的基数集为{1,3,5,7,8}, 基数(不重复元素)为5.基数估计就是在误差可接受的范围内快速计算基数。就是不重复的元素的个数
3.8.2 常用命令
【1】pfadd
将所有元素参数添加到 Hyperloglog 数据结构中。
语法结构
pfadd key element1 element2……
示例
如果至少有个元素被添加返回 1 否则返回 0。
pfadd book1 uid1 uid2 uid3 注意 添加元素到HyperLogLog中如果内部有变动返回1没有返回0。 【2】pfcount
计算Hyperloglog 近似基数可以计算多个Hyperloglog 统计基数总数。
语法结构
pfcount key1 key2……
示例
pfcount book1 #计算book1的基数结果为3
pfadd book2 uid3 uid4 #添加两个元素到book2中
pfcount book1 book2 #统计两个key的基数总数结果为5 【3】pfmerge
将一个或多个Hyperloglogsourcekey1 合并成一个 Hyperloglog destkey 。
语法结构
pfmerge destkey sourcekey1 sourcekey2……
示例 比如每月活跃用户可用每天活跃用户合并后计算。
#将book1和book2合并成book结果为5
pfmerge book book1 book2 3.8.3 使用场景
基数不大数据量不大就用不上会有点大材小用浪费空间有局限性就是只能统计基数数量而没办法去知道具体的内容是什么和bitmap相比属于两种特定统计情况简单来说HyperLogLog 去重比 bitmaps 方便很多一般可以bitmap和hyperloglog配合使用bitmap标识哪些用户活跃。 网站PV统计 网站UV统计 统计访问量(IP数) 统计在线用户数 统计每天搜索不同词条的个数 统计文章真实阅读数
第四章 Redis 配置文件
在redis的解压目录下有个重要的配置文件redis.conf
4.1 节 units单位
配置大小单位开头定义基本度量单位只支持bytes大小写不敏感。
4.2 节 INCLUDES
Redis只有一个配置文件如果多个人进行开发维护那么就需要多个这样的配置文件这时候多个配置文件就可以在此通过 include/path/to/local.conf 配置进来而原本的 redis.conf 配置文件就作为一个总闸。 4.3 节 NETWORK 参数 bind:绑定redis服务器网卡IP默认为127.0.0.1,即本地回环地址。这样的话访问redis服务只能通过本机的客户端连接而无法通过远程连接。如果bind选项为空的话那会接受所有来自于可用网络接口的连接。 port指定redis运行的端口默认是6379。由于Redis是单线程模型因此单机开多个Redis进程的时候会修改端口。 timeout设置客户端连接时的超时时间单位为秒。当客户端在这段时间内没有发出任何指令那么关闭该连接。默认值为0表示不关闭。 tcp-keepalive 单位是秒表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态避免服务器一直阻塞官方给出的建议值是300s如果设置为0则不会周期性的检测。 4.4 节 GENERAL 具体配置详解 daemonize:设置为yes表示指定Redis以守护进程的方式启动后台启动。默认值为 no pidfile:配置PID文件路径当redis作为守护进程运行的时候它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面 loglevel 定义日志级别。默认值为notice有如下4种取值 debug记录大量日志信息适用于开发、测试阶段 verbose较多日志信息 notice适量日志信息使用于生产环境 warning仅有部分重要、关键信息才会被记录 logfile 配置log文件地址,默认打印在命令行终端的窗口上 databases设置数据库的数目。默认的数据库是DB 0 可以在每个连接上使用select 命令选择一个不同的数据库dbid是一个介于0到databases - 1 之间的数值。默认值是 16也就是说默认Redis有16个数据库。 4.5 节 SNAPSHOTTING
这里的配置主要用来做持久化操作。 参数 save这里是用来配置触发 Redis的持久化条件也就是什么时候将内存中的数据保存到硬盘 save 900 1表示900 秒内如果至少有 1 个 key 的值变化则保存 save 300 10表示300 秒内如果至少有 10 个 key 的值变化则保存 save 60 10000表示60 秒内如果至少有 10000 个 key 的值变化则保存 4.6 节 REPLICATION 参数 slave-serve-stale-data默认值为yes。当一个 slave 与 master 失去联系或者复制正在进行的时候slave 可能会有两种表现 如果为 yes slave 仍然会应答客户端请求但返回的数据可能是过时或者数据可能是空的在第一次同步的时候。 如果为 no 在你执行除了 info he salveof 之外的其他命令时slave 都将返回一个 SYNC with master in progress 的错误 slave-read-only配置Redis的Slave实例是否接受写操作即Slave是否为只读Redis。默认值为yes。 repl-diskless-sync主从数据复制是否使用无硬盘复制功能。默认值为no。 repl-diskless-sync-delay当启用无硬盘备份服务器等待一段时间后才会通过套接字向从站传送RDB文件这个等待时间是可配置的。 repl-disable-tcp-nodelay同步之后是否禁用从站上的TCP_NODELAY 如果你选择yesredis会使用较少量的TCP包和带宽向从站发送数据。 4.7 节 SECURITY
requirepass设置redis连接密码。 比如: requirepass 123 表示redis的连接密码为123。 4.8 节 CLIENTS maxclients 设置客户端最大并发连接数默认无限制Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件。 描述符数-32redis server自身会使用一些如果设置maxclients为0 。表示不作限制。当客户端连接数到达限制时 Redis会关闭新的连接并向客户端返回max number of clients reached错误信息 4.9 节 MEMORY MANAGEMENT 参数 maxmemory设置Redis的最大内存如果设置为0 。表示不作限制。通常是配合下面介绍的maxmemory-policy参数一起使用。 maxmemory-policy 当内存使用达到maxmemory设置的最大值时redis使用的内存清除策略。有以下几种可以选择 volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used ) allkeys-lru 利用LRU算法移除任何key volatile-random 移除设置过过期时间的随机key allkeys-random 移除随机key volatile-ttl 移除即将过期的key(minor TTL) noeviction noeviction 不移除任何key只是返回一个写错误 默认选项 4.10 节 APPEND ONLY MODE 参数 appendonly默认redis使用的是rdb方式持久化这种方式在许多应用中已经足够用了。但是redis如果中途宕机会导致可能有几分钟的数据丢失根据save来策略进行持久化 Append Only File是另一种持久化方式 可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入appendonly.aof文件每次启动时Redis都会先把这个文件的数据读入内存里先忽略RDB文件。默认值为no。 appendfilename aof文件名默认是appendonly.aof appendfsyncaof持久化策略的配置no表示不执行fsync由操作系统保证数据同步到磁盘速度最快always表示每次写入都执行fsync以保证数据同步到磁盘everysec表示每秒执行一次fsync可能会导致丢失这1s数据 4.11 节 LUA SCRIPTING 参数 lua-time-limit一个lua脚本执行的最大时间单位为ms。默认值为5000. 4.12 节 REDIS CLUSTER 参数 cluster-enabled集群开关默认是不开启集群模式。 cluster-config-file集群配置文件的名称。 cluster-node-timeout 可以配置值为15000。节点互连超时的阀值集群节点超时毫秒数 cluster-slave-validity-factor 可以配置值为10。 第五章 Redis Java客户端 在Redis官网中提供了各种语言的客户端地址https://redis.io/docs/connect/clients/
标记为*的就是推荐使用的java客户端包括 Jedis和Lettuce这两个主要是提供了Redis命令对应的API方便我们操作Redis而SpringDataRedis又对这两种做了抽象和封装因此我们后期会直接以SpringDataRedis来学习。 Redisson是在Redis基础上实现了分布式的可伸缩的java数据结构例如Map、Queue等而且支持跨进程的同步机制Lock、Semaphore等待比较适合用来实现特殊的功能需求。 4.1 节 Jedis 客户端
Jedis的官网地址 https://github.com/redis/jedis
4.1.1.快速入门
1引入依赖
!--jedis--
dependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion3.7.0/version
/dependency
!--连接池--
dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactIdversion2.11.1/version
/dependency
!--单元测试--
dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter/artifactIdversion5.7.0/versionscopetest/scope
/dependency
2编写入门程序
新建一个单元测试类内容如下
/*** jedis入门程序*/
public class JedisTest {Jedis jedis;BeforeEachpublic void before(){//建立连接jedis new Jedis(192.168.184.129,6379);//设置密码jedis.auth(123456);//选择库jedis.select(0);}Testpublic void stringTest(){//存数据jedis.set(name,张三);//获取数据System.out.println(jedis.get(name));}Testpublic void hashTest(){//存数据jedis.hset(user:1,name,张三);jedis.hset(user:1,age,22);//取数据MapString, String map jedis.hgetAll(user:1);System.out.println(map);}AfterEachpublic void after(){if(jedis!null){jedis.close();}}
}
4.1.2.连接池
Jedis本身是线程不安全的并且频繁的创建和销毁连接会有性能损耗因此我们推荐大家使用Jedis连接池代替Jedis的直连方式。
public class JedisConnectionFactory {private static JedisPool jedisPool;static {//配置连接池JedisPoolConfig poolConfig new JedisPoolConfig();poolConfig.setMaxTotal(8);poolConfig.setMaxIdle(8);poolConfig.setMinIdle(0);// 创建连接池对象参数连接池配置、服务端ip、服务端端口、超时时间、密码jedisPool new JedisPool(poolConfig, 192.168.184.129, 6379, 1000, 123456);}public static Jedis getJedis(){return jedisPool.getResource();}public static void main(String[] args) {System.out.println(JedisConnectionFactory.getJedis());}
}
4.2 节 SpringDataRedis 客户端
SpringData是Spring中数据操作的模块包含对各种数据库的集成其中对Redis的集成模块就叫做SpringDataRedis官网地址Spring Data Redis 提供了对不同Redis客户端的整合Lettuce和Jedis 提供了RedisTemplate统一API来操作Redis 支持Redis的发布订阅模型 支持Redis哨兵和Redis集群 支持基于Lettuce的响应式编程 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化 支持基于Redis的JDKCollection实现 SpringDataRedis中提供了RedisTemplate工具类其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中
API返回值类型说明redisTemplate.opsForValueValueOperations操作String类型数据redisTemplate.opsForHash()HashOperations操作Hash类型数据redisTemplate.opsForList()ListOperations操作List类型数据redisTemplate.opsForSet()SetOperations操作Set类型数据redisTemplate.opsForZset()ZSetOperations操作SortedSet类型数据redisTemplate通用命令 4.2.1 快速入门
SpringBoot已经提供了对SpringDataRedis的支持使用非常简单。
首先新建一个maven项目然后按照下面步骤执行
1引入依赖
dependencies!--redis依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!--common-pool--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactId/dependency!--Jackson依赖--dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactId/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependency
/dependencies
2配置Redis
spring:redis:host: 192.168.184.129port: 6379password: 123456lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: 100ms
3注入RedisTemplate编写测试代码
SpringBootTest
public class RedisTemplateTests {Autowiredprivate RedisTemplate redisTemplate;Testpublic void testString() {// 写入一条String数据redisTemplate.opsForValue().set(name, 张三);// 获取string数据Object name redisTemplate.opsForValue().get(name);System.out.println(name name);}
}
4.2.2.自定义序列化
RedisTemplate可以接收任意Object作为值写入Redis
只不过写入前会把Object序列化为字节形式默认是采用JDK序列化得到的结果是这样的 我们可以自定义RedisTemplate的序列化方式代码如下
Configuration
public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory connectionFactory){// 创建RedisTemplate对象RedisTemplateString, Object template new RedisTemplate();// 设置连接工厂template.setConnectionFactory(connectionFactory);// 创建JSON序列化工具GenericJackson2JsonRedisSerializer jsonRedisSerializer new GenericJackson2JsonRedisSerializer();// 设置Key的序列化template.setKeySerializer(RedisSerializer.string());template.setHashKeySerializer(RedisSerializer.string());// 设置Value的序列化template.setValueSerializer(jsonRedisSerializer);template.setHashValueSerializer(jsonRedisSerializer);// 返回return template;}
}
这里采用了JSON序列化来代替默认的JDK序列化方式。最终结果如图 整体可读性有了很大提升并且能将Java对象自动的序列化为JSON字符串并且查询时能自动把JSON反序列化为Java对象。不过其中记录了序列化时对应的class名称目的是为了查询时实现自动反序列化。这会带来额外的内存开销。
4.2.3.StringRedisTemplate
为了节省内存空间我们可以不使用JSON序列化器来处理value而是统一使用String序列化器要求只能存储String类型的key和value。当需要存储Java对象时手动完成对象的序列化和反序列化。
省去了我们自定义RedisTemplate的序列化方式的步骤而是直接使用
SpringBootTest
public class StringRedisTemplateTest {Autowiredprivate StringRedisTemplate stringRedisTemplate;// JSON序列化工具private static final ObjectMapper mapper new ObjectMapper();Testvoid testSaveUser() throws JsonProcessingException {// 创建对象User user new User();user.setId(2);user.setName(李四);user.setAge(33);// 手动序列化String json mapper.writeValueAsString(user);// 写入数据stringRedisTemplate.opsForValue().set(user:2, json);// 获取数据String jsonUser stringRedisTemplate.opsForValue().get(user:2);// 手动反序列化User user1 mapper.readValue(jsonUser, User.class);System.out.println(user1 user1);}
}
但一般还是常用自动序列化
第六章 Redis 发布订阅
6.1 节 什么是发布与订阅
Redis 发布订阅 (pub/sub) 是一种消息通信模式发送者 (pub) 发送消息订阅者 (sub) 接收消息。
6.2 节 什么时候用发布订阅
看到发布订阅的特性可用来做一个简单的实时聊天系统。再比如在一个博客网站中有100个粉丝订阅了你当你发布新文章就可以推送消息给粉丝们拉。
6.3 节 Redis的发布订阅
6.4 节 发布订阅命令
订阅
语法格式
subscribe 频道名字
示例
127.0.0.1:6379 subscribe channel-1
Reading messages... (press Ctrl-C to quit)
1) subscribe
2) channel-1
3) (integer) 1 发布命令
语法格式
publish channel-1 hello
示例 打开另一个客户端给channel1发布消息hello
127.0.0.1:6379 publish channel-1 hello
(integer) 1 注意 返回的1是订阅者数量。 打开第一个客户端可以看到发送的消息
127.0.0.1:6379 subscribe channel-1
Reading messages... (press Ctrl-C to quit)
1) subscribe
2) channel-1
3) (integer) 1
1) message
2) channel-1
3) hello 注意 发布的消息没有持久化如果在订阅的客户端收不到hello只能收到订阅后发布的消息。 第七章 Redis 慢查询
7.1 节 什么是慢查询
慢查询顾名思义就是比较慢的查询但是究竟是哪里慢呢
Redis执行命令过程如下 说明 慢查询发生在第3阶段 客户端超时不一定慢查询但慢查询是客户端超时的一个可能因素 慢查询日志是存放在Redis内存列表中 7.2 节 慢查询日志
什么是慢查询日志
慢查询日志是Redis服务端在命令执行前后计算每条命令的执行时长当超过某个阈值是记录下来的日志。日志中记录了慢查询发生的时间还有执行时长、具体什么命令等信息它可以用来帮助开发和运维人员定位系统中存在的慢查询。
如何获取慢查询日志
可以使用 slowlog get 命令获取慢查询日志在 slowlog get 后面还可以加一 个数字用于指定获取慢查询日志的条数比如获取3条慢查询日志
127.0.0.1:6379 SLOWLOG get 3
1) (integer) 0
2) (integer) 1640056567
3) (integer) 11780
4) 1) FLUSHALL
5) 127.0.0.1:43406
6) 参数 唯一标识ID 命令执行的时间戳 命令执行时长 执行的命名和参数 如何获取慢查询日志的长度?
可以使用 slowlog len 命令获取慢查询日志的长度 slowlog len
(integer) 121 注意 当前Redis中有121条慢查询日志。 7.3 节 怎么配置慢查询参数
配置慢查询参数如下 命令执行时长的指定阈值 slowlog-log-slower-than slowlog-log-slower-than的作用是指定命令执行时长的阈值执行命令的时长超过这个阈值时就会被记录下来。 存放慢查询日志的条数 slowlog-max-len。 slowlog-max-len的作用是指定慢查询日志最多存储的条数。实际上Redis使用了一个列表存放慢查询日志slowlog-max-len就是这个列表的最大长度。
如何进行配置
【1】查看慢日志配置
查看redis慢日志配置登陆redis服务器使用redis-cli客户端连接redis server
127.0.0.1:6379 config get slow*
1) slowlog-max-len
2) 128
3) slowlog-log-slower-than
4) 10000 慢日志说明 10000阈值单位微秒此处为10毫秒128慢日志记录保存数量的阈值此处保存128条。 【2】修改Redis配置文件
比如把slowlog-log-slower-than设置为1000slowlog-max-len 设置为1200
slowlog-log-slower-than 1000
slowlog-max-len 1200 【3】也可以使用 config set 命令动态修改。
比如还是把slowlog-log-slower-than设置为1000slowlog-max-len设置为1200 config set slowlog-log-slower-than 1000
OKconfig set slowlog-max-len 1200
OKconfig rewrite
OK 7.4 节 实践建议
slowlog-max-len配置建议 线上建议调大慢查询列表记录慢查询时Redis会对长命令做截断操作并不会占用大量内存。 增大慢查询列表可以减缓慢查询被剔除的可能例如线上可设置为1000以上。
slowlog-log-slower-than配置建议 默认值超过10毫秒判定为慢查询需要根据Redis并发量调整该值。 由于Redis采用单线程响应命令对于高流量的场景如果命令执行时间在1毫秒以上那么Redis最多可支撑OPS不到1000。因此对于高OPS场景的Redis建议设置为1毫秒。 第八章 Redis 流水线 pipeline
8.1 节 Redis网络通讯模型弊端
1次网络命令通信模型
经历了1次时间 1次网络时间 1次命令时间。
批量网络命令通信模型
经历了 n次时间 n次网络时间 n次命令时间
8.2 节 什么是流水线
经历了 1次pipeline(n条命令) 1次网络时间 n次命令时间这大大减少了网络时间的开销这就是流水线。
8.3 节 案例 注意 在执行批量操作而没有使用pipeline功能会将大量的时间耗费在每一次网络传输的过程上而使用pipeline后只需要经过一次网络传输然后批量在redis端进行命令操作。这会大大提高了效率。 pipeline-Jedis实现
【1】首先引入jedis依赖包
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId
/dependency
【2】没有pipeline的命令执行
Test
void test1(){redisTemplate.opsForValue().set(k1,v1);redisTemplate.opsForValue().set(k2,v2);redisTemplate.opsForValue().set(k3,v3);
}
Test
void test2() {long start System.currentTimeMillis();Object k1 redisTemplate.opsForValue().get(k1);Object k2 redisTemplate.opsForValue().get(k2);Object k3 redisTemplate.opsForValue().get(k3);long end System.currentTimeMillis();System.out.println(话费时间(end-start));
} 注意 在不使用pipeline的情况下使用for循环进行每次一条命令的执行操作耗费的时间可能达到 1w 条插入命令的耗时为50s。 【3】使用pipeline
Test
void test3() {redisTemplate.executePipelined((RedisConnection connection)-{long start System.currentTimeMillis();Object k1 connection.get(k1.getBytes());Object k2 connection.get(k2.getBytes());Object k3 connection.get(k3.getBytes());long end System.currentTimeMillis();System.out.println(话费时间(end-start));return null;});}
耗时会大大减少
第九章 Redis 持久化机制
由于Redis的数据都存放在内存中如果没有配置持久化Redis重启后数据就全丢失了于是需要开启Redis的持久化功能将数据保存到磁盘上当Redis重启后可以从磁盘中恢复数据。
9.1 节 Redis持久化概述
对于Redis而言持久化机制是指把内存中的数据存为硬盘文件 这样当Redis重启或服务器故障时能根据持久化后的硬盘文件恢复数据
持久化机制的意义
redis持久化的意义在于故障恢复。比如部署了一个redis作为cache缓存同时也可以保存一些比较重要的数据。 Redis提供了两个不同形式的持久化方式 RDB(Redis DataBase) AOF(Append Only File)
9.2 节 RDB持久化机制
9.2.1 什么是RDB?
RDB是什么
在指定的时间间隔内将内存的数据集快照写入磁盘也就是行话讲的快照它恢复时是将快照文件直接读到内存里。
9.2.2 RDB基本配置
配置dump.rdb文件
RDB保存的文件在redis.conf中配置文件名称默认为dump.rdb。
440 # The filename where to dump the DB
441 dbfilename dump.rdb
rdb文件的保存位置也可以修改。默认在Redis启动时命令行所在的目录下。
当前路径
dir ./ 触发机制-主要三种方式
RDB配置 快照默认配置 save 3600 1表示3600秒内一小时如果至少有1个key的值变化则保存。 save 300 100表示300秒内五分钟如果至少有100个 key 的值变化则保存。 save 60 10000表示60秒内如果至少有 10000个key的值变化则保存。 配置新的保存规则
给redis.conf添加新的快照策略30秒内如果有5次key的变化则触发快照。配置修改后需要重启Redis服务。
save 3600 1
save 300 100
save 60 10000
save 30 5
flushall
执行flushall命令也会触发rdb规则。
save与bgsave
手动触发Redis进行RDB持久化的命令有两种 save 该命令会阻塞当前Redis服务器执行save命令期间Redis不能处理其他命令直到RDB过程完成为止不建议使用。 bgsave 执行该命令时Redis会在后台异步进行快照操作快照同时还可以响应客户端请求。
9.2.3 RDB高级配置
stop-writes-on-bgsave-error
默认值是yes。当Redis无法写入磁盘的话直接关闭Redis的写操作。 rdbcompression
默认值是yes。对于存储到磁盘中的快照可以设置是否进行压缩存储。如果是的话redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话可以设置为关闭此功能但是存储在磁盘上的快照会比较大。 rdbchecksum
默认值是yes。在存储快照后我们还可以让redis使用CRC64算法来进行数据校验但是这样做会增加大约10%的性能消耗如果希望获取到最大的性能提升可以关闭此功能。 恢复数据
只需要将rdb文件放在Redis的启动目录Redis启动时会自动加载dump.rdb并恢复数据。
9.2.4 RDB的优势与劣势
优势 适合大规模的数据恢复 对数据完整性和一致性要求不高更适合使用 节省磁盘空间 恢复速度快
劣势 在备份周期在一定间隔时间做一次备份所以如果Redis意外down掉的话就会丢失最后一次快照后的所有修改。 9.3 节 AOF持久化机制
9.3.1 什么是AOF
以日志的形式来记录每个写操作将Redis执行过的所有写指令记录下来。
AOF默认不开启
可以在redis.conf中配置文件名称默认为appendonly.aof。 注意
AOF文件的保存路径同RDB的路径一致如果AOF和RDB同时启动Redis默认读取AOF的数据。
AOF同步频率设置 参数 appendfsync always 始终同步每次Redis的写入都会立刻记入日志性能较差但数据完整性比较好。 appendfsync everysec 每秒同步每秒记入日志一次如果宕机本秒的数据可能丢失。 appendfsync no redis不主动进行同步把同步时机交给操作系统。 优势 备份机制更稳健丢失数据概率更低。 可读的日志文本通过操作AOF稳健可以处理误操作。
劣势 比起RDB占用更多的磁盘空间。 恢复备份速度要慢。 每次读写都同步的话有一定的性能压力。
9.4 节 如何选用持久化方式
综合使用AOF和RDB两种持久化机制
用AOF来保证数据不丢失作为数据恢复的第一选择用RDB来做不同程度的冷备在AOF文件都丢失或损坏不可用的时候还可以使用RDB来进行快速的数据恢复。
第十章 总结
【1】你都用过哪些Redis数据类型
答String、List、Set、Map、ZSet、BitMaps、GEO、HyperLogLog。
常规缓存用String类型 、对象经常修改字段用Map类型 、BitMaps处理打卡上班记录等问题GEO处理地理坐标类问题HyperLogLo处理PV,UV等基数统计操作。
List可以实现排行榜最新列表等功能。Set实现共同联系人黑白名单功能。
ZSet可以实现特定条件的排行榜。按照人气排行人气作为存储分数。 【2】说一下发布订阅机制
答:发布订阅机制可以实现类似你订阅某个频道后该频带给你发送消息的功能订阅频道命令
subscribie 频道
# 发送消息
publish 频道名 消息 【3】如何解决慢查询问题
答通过慢查询日志解决slowlog len获取慢查询记录数在通过slowlog get n获取具体信息去排查。
还可以通过 config set slowlog-log-slower-than 1000
OKconfig set slowlog-max-len 1200
OKconfig rewrite
OK
慢查询阈值根据QPS设置 【4】说以下说什么是流水线操作 答一次网络连接 执行n条redis指令。 【5】说以下Redis持久化机制
答Redis支持两种持久化机制RDB和AOF。RDB是快照持久化读写速度快占用磁盘空间小。但有丢失数据风险。AOF通过记录命令日志持久化不易丢失数据但是占用磁盘空间大读写速度慢。RDB适合做冷备如一天一备份的常规备份。AOF适合做REDIS正常重启前的数据备份不会丢失数据。