Redis详细知识点

1.Redis简介


1.1 概念
Redis(Remote Dictionary Server)
使用c语言开发的一个开源的高性能键值对(key-value)数据库

1.2 特征

  • 数据见没有必然的关联关系
  • 内部采用单线程机制进行工作
  • 高性能:读的速度是11w/s,写的速度是8w次/s
  • 多数据类型支持
    • 字符串类型 string
    • 列表类型 list
    • 散列类型 hash
    • 集合类型 set
    • 有序集合类型 sorted_set
  • 持久化支持。可以进行数据灾难恢复

1.3 应用

  • 为热点数据加速查询(主要场景),如热点商品,热点新闻,热点咨询,推广类等高访问量信息等
  • 任务队列,如秒杀,抢购,购票排队等
  • 即时信息查询,如排行榜,各类网站访问统计,公交到站信息,在线人数信息,设备信号等
  • 时效性信息控制,如验证码控制,投票控制等
  • 分布式数据共享,如分布式集群架构中的session分离
  • 消息队列
  • 分布式锁

2. Redis下载安装


2.1 Linux 版(适用于企业级开发)

基于Center OS 7安装Redis(4.0.0版本)

  • 下载安装包
    • wget http://download.redis.io/release/redis-???.tar.gz
  • 解压
    • tar -xvf 文件名.tar.gz
  • 编译
    • make
  • 安装
    • make install

Redis服务启动

  • 默认配置启动

redis-server
redis-server --port 6379
redis-server --port 6380

  • 指定配置文件启动

redis-server redis.conf
redis-server redis-6379.conf
redis-server redis-6380.conf
redis-server conf/redis-6379.conf
redis-server conf/redis-6380.conf

Redis客户端连接

  • 默认连接

redis-cli

  • 连接指定服务器

redis-cli -h 127.0.0.1
redis-cli -p 6379
redis-cli -h 127.0.0.1 -p 6379

Redis服务端配置

  • 基本配置

daemonize yes
以守护进程方式启动,使用本启动方式,redis将以服务的形式存在,日志将不再打印在目录窗口中
port 6***
设定当前服务启动端口号
dir “/自定义目录/redis/data”
设定当前服务文件保存位置,包含日志文件,持久化文件等
logfile “6***.log”
设定日志文件名,便于查阅

在这里插入图片描述

2.2 Windows 版(适合零基础学习)

以 3.2版本作为主版本
下载地址:https://github.com/MSOpenTech/redis/tags

3. Redis的基本操作


命令行模式工具使用

  • 功能性命令
    • 信息添加
      功能:设置key,value数据
      命令:set key value
      范例:set name haha
    • 信息查询
      功能:根据key查询对应的value,如果不存在,返回空(nil)
      命令:get key
      范例:get name
    • 清除屏幕信息
      功能:清除屏幕信息
      命令:clear
    • 帮助信息查阅
      功能:获取命令帮助文档,获取组中所有的命令信息名称
      命令:help 命令名称
      命令:help @组名
    • 退出指令
      命令:quit;exit;ESC

4. Redis的基本数据类型


4.1 String 类型

存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
存储数据的格式:一个存储空间保存一个数据
存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

String类型的基本操作

1.添加/修改数据

set key value

2.获取数据

get key

3.删除数据

del key

4.添加/修改多个数据(m:Multiple)

mset key1 value1 key2 value2 …

5.获取多个数据

mget key1 key2 …

6.获取数据字符个数(字符串长度)

strlen key

7.追加信息到原始信息后部(如果原始信息存在就追加,否则新建)

append key value

8.设置数值数据增加指定范围的值

incr key
incrby key increment
incrbyfloat key increment

9.设置数值数据减少指定范围的值

decr key
decrby key increment

10.设置数据具有指定的生命周期

setex key seconds value
psetex key milliseconds value

4.2 hash 类型

存储的困惑:对象类数据的存储如果具有较频繁的更新需求操作会显得笨重
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
需要的存储结构:一个存储空间保存多个键值对数据
hash类型:底层使用哈希表结构实现数据存储

Hash类型的基本操作

1.添加/修改数据

hset key field value

2.获取数据

hget key field
hgetall key

3.删除数据

hdel key field1 [filed2]

4.添加/修改多个数据

hmset key field1 value1 field2 value2 …

5.获取多个数据

hmget key field1 field2 …

6.获取哈希表中字段的数量

hlen key

7.获取哈希表中是否存在指定的字段

hexists key field

8.获取哈希表所有的字段名或字段值

hkeys key
hvals key

9.获取指定字段的数值数据增加指定范围的值

hincrby key field increment
hincrbyfloat key field increment

10.有字段不改变,没有进行添加

hsetnx key field value

Hash类型的注意事项

1.hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应值为(nil)
2.每个hash可以存储2的32次方-1个键值对
3.hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
4.hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈

4.3 list 类型

数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
需要的存储结构,一个存储空间保存多个数据,且通过数据可以体现进入顺序
list类型:保存多个数据,底层使用双向链表存储结构实现

list 类型的基本操作
1.添加/修改数据

lpush key value1 [value2]…
rpush key value1 [value2]…

2.获取数据

lrange key start stop
lindex key index
llen key

3.获取并移除数据

lpop key
rpop key

4.规定时间内获取并移除数据

blpop key1 [key2] timeout
brpop key1 [key2] timeout

5.移除指定数据

lrem key count value

list 类型的注意事项

1.list 保存的数据都是string类型的,数据总容量时有限的,最多2的32次-1个元素
2.list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
3.获取全部数据操作结束索引设置为-1
4.list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多信息通过数据库的方式加载

4.4 set 类型

新的存储需求:存储大量的数据,在查询方面提供更高的效率
需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的

set 类型的基本操作
1.添加数据

sadd key member1 [member2]

2.获取全部数据

smembers key

3.删除数据

srem key member [member2]

4.获取集合数据总量

scard key

5.判断集合中是否包含指定数据

sismember key member

6.随机获取集合中指定数量的数据

srandmember key [count]

7.随机获取集合中的某个数据并将该数据移出集合

spop key

8.求两个集合的交,并,差集

sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]

9.求两个集合的交,并,差集并存储到指定集合中

sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]

10.将指定数据从原始集合中移动到目标集合中

smove source(原) destination(目标) member(值)

set 类型的注意事项

1.set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
2.set虽然与hash的存储结构相同,但是无法启用hash存储值的空间

4.5 sorted_set 类型

新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
需要的存储结构:新的存储模型,可以保存可排序的数据
sorted_set类型:在set的存储结构基础上添加可排序字段

sorted_set 类型的基本操作
1.添加数据

zadd key score1 member1 [score2] member2

2.获取全部数据

zrange key start stop [withscores] (升序)
zrevrange key start stop [WITHSCORES] (降序)

3.删除数据

zrem key member [member …]

4.按条件获取数据

zrangebyscore key min max [WITHSCORES] [LIMIT]
zrevrangebyscore key max min [WITHSCORES]

5.按条件删除数据

zremrangebyrank key start stop
zremrangebyscore key min max

6.获取集合数据总量

zcard key
zcount key min max

7.集合交并操作

zinterstore destination numkeys key [key …]
zunionstore destination numkeys key [key …]

注意:

min 与 max 用于限定搜索查询的条件
start 与 stop 用于限定查询范围,作用于索引,表示开始和结束索引
offset 与 count 用于限定查询范围,作用于查询结果,表示开始位置和数据总量

8.获取数据对应的索引

zrank key member
zrevrank key member

9.score值获取与修改

zscore key member
zincrby key increment member

sorted_set类型的注意事项

1.score保存的数据存储空间是64位,如果是整数范围是-910的15次~910的15次
2.score保存的数据可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失经度
3.sorted_set底层存储还是基于set结构的,因此数据不能重复,相同数据会被覆盖

5. Redis的高级数据类型


5.1 Bitmaps 类型

基本操作

1.获取指定key对应偏移量上的bit值

getbit key offset

2.设定指定key对应偏移量上的bit值,value只能是1或0

setbit key offset value

3.对指定key按位进行交,并,非,异或操作,并将结果保存到destKey中

bitop op destKey key1 [key2 …]
op类型:
and:交
or:并
not:非
xor:异或

4.统计指定key中1的数量

bitcount key [start end]

5.2 HyperLogLog 类型

基数
基数是数据集去重后元素的个数
HyperLogLog是用来做基数统计的,运用了LogLog的算法

基本操作
1.添加数据

pfadd key element [element …]

2.统计数据

pfcount key [key …]

3.合并数据

pfmerge destkey sourcekey [sourcekey …]

相关说明

用于进行基数统计,不是集合,不保存数据,只记录数量而不是具体数据
核心是基数估算算法,最终数值存在一定误差
误差范围:基数估计得结果是一个带有0.81%标准错误的近似值
耗空间极小,每个hyperloglog key占用了12k的内存用于标记基数
pfadd命令不是一次性分配12k内存使用,会随着基数的增加内存逐渐增大
pfmerage命令合并后占用的存储空间为12k,无论合并之前数据量多少

5.3 GEO 类型

应用于地理位置计算

基本操作
1.添加坐标点

geoadd key longitude latitude member [longitude latitude member…]

2.获取坐标点

geopos key member [member …]

3.计算坐标点距离

geodist key member1 member2 [unit]

4.根据坐标求范围内的数据

georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]

5.根据点求范围内的数据

georadiusbymember key member radius m|km|ft|mi withcoord] [withdist] [withhash] [count count]

6.获取指定点对应的坐标hash值

geohash key member [member …]

6. 通用命令-key


key特征:key是一个字符串,通过key获取redis中的数据
key应该设计那些操作?
1.对于ket自身状态的相关操作,例如;删除,判定存在,获取类型等
2.对于key有效性控制相关操作,例如:有效期设定,判定是否有效,有效状态切换等
3.对于key快速查询操作,例如:按置顶策略查询key

基本操作
1.删除指定key

del key

2.获取key是否存在

exists key

3.获取key的类型

type key

4.为指定key设置有效期

expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp

5.获取key的有效时间

ttl key(得到秒数)
pttl key(得到毫秒数)

6.切换key从时效性转换为永久性

persist key

7.查询key

keys pattern
查询模式规则:

  • *匹配任意数量的任意符号
    ? 匹配一个任意符号
    [] 匹配一个指定符号
    keys * :查询所有
    keys it
    :查询所有以it开头
    keys *heima :查询所有以heima结尾
    keys ??heima :查询所有前面两个字符任意,后面以heima结尾
    keys user:? :查询所有以user:开头,最后一个字符任意
    keys u[st]er:1 :查询所有以u开头,以er:1结尾,中间包含一个字母,s或t

8.为key改名

rename key newkey
renamenx key newkey

9.对所有key排序

sort

10.其他key通用操作

help @generic

7. 通用指令-数据库

redis为每个服务提供有16个数据库,编号从0到15
每个数据库之间数据相互独立

基本操作
1.切换数据库

select idnex

2.数据移动

move key db
【1.移动即删除 2.必须保证数据没有才能移动成功】

3.数据清除

dbsize:库key的总量
flushdb:清除当前库
flushall:清除所有库

4.其他操作

quit
ping
echo message

8. 持久化

什么是持久化?

利用永久性存储介质将数据进行保存,在特定的时间将保存的数据进行恢复的工作机制称为持久化

为什么要持久化?

防止数据的意外丢失,确保数据安全性

持久化过程保存什么?

RDB:将当前数据状态进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据
AOF:将数据的操作过程进行保存,日志形式,存储操作过程,存储格式复杂,关注点在数据的操作过程

8.1 持久化-RDB

命令:save
作用:手动执行一次保存操作

RDB启动方式-save指令相关配置

dbfilename dump.rdb
说明;设置本地数据库文件名,默认值为dump.rdb
经验:通常设置为 dump-端口号.rdb
dir
说明:设置存储.rdb文件的路径
经验:通常设置成存储空间较大的目录中,目录名称data
rdbcompression yes
说明:设置存储至本地数据库时是否压缩数据,默认为yes,采用LZF压缩
经验:通常默认为开启状态,如果设置为no,可以节省CPU运行时间,但会使存储的文件变大
rdbchecksum yes
说明:设置是否进行RDB文件格式校验,该校验过程在写文件和读文件过程均进行
经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存在一定的数据损坏风险

RDB启动方式 - save指令工作原理

save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞,线上环境不建议使用

数据量过大,单线程执行方式造成效率过低如何处理 ?

命令:bgsave
作用:手动启动后台保存操作,但不是立即执行

RDB启动方式 - bgsave 指令工作原理

1.发送指令
2.调用fork函数生成子进程
3.创建rdb文件
4.返回消息
注:bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方式,save命令可以放弃使用

bgsave指令相关配置

stop-writes-on-bgsave-error yes
说明:后台存储过程中如果出现错误现象,是否停止保存操作
经验:通常默认为开启状态
配置:save second changes
作用:满足限定时间范围内key的变化数量达到指定数据即进行持久化
second:监控时间范围
changes:监控key的变化量
范例:
save 900 1
save 300 10
save 60 10000
save 配置原理
发送指令
返回结果
1.会对数据产生影响
2.真正产生了影响
3.不进行数据比对
注:
save配置要根据实际业务情况进行设置,频度过高或过低都会出现性能问题,结果可能是灾难性的
save配置中对于second与changes设置通常具有互补对应关系,精良不要设置成包含性关系
save配置启动后执行的是bgsave操作
全量复制
服务器运行过程中重启
debug reload
关闭服务器时执行保存数据
shutdown save

RDB优点

RDB一个紧凑压缩的二进制文件,存储效率较高
RDB内部存储的是redis在某个时间点的数据快照,非常适用于数据备份,全量复制等场景
RDB恢复数据的速度要比AOF快很多
应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复

RDB缺点

RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
bgsave指令每次运行要执行fork操作创建子进程,要牺牲一些性能
Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象

8.2 持久化-AOF

RDB存储的弊端

存储的数据量较大,效率较低
基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低
大数据量下的IO性能较低
基于fork创建子进程,内存产生额外消耗
宕机带来的数据丢失风险

AOF概念

AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令
达到恢复数据的目的。与RDB相比可以简单描述为改记录数据为记录数据产生过程
AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式

AOF写数据过程

AOF写命令刷新缓存区
缓存区将命令同步到AOF文件中

AOF写数据的三种策略(appendfsync)

always(每次)
每次写入操作均同步到AOF文件中,数据零误差,性能较低
everysec(每秒)-建议使用,也是默认配置
每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高
再系统突然宕机的情况下丢失1秒内的数据
no(系统控制)
由操作系统控制每次同步到AOF文件的周期,整体过程不可控

AOF功能开启

配置
appendonly yes|no
作用
是否开启AOF持久化功能,默认为不开启状态
配置
appendfsync always|everysec|no
作用
AOF写数据策略
配置
appendfilename filename
作用
AOF持久化文件名,默认文件名未appendonly.aof,建议配置为appendonly-端口号.aof
配置
dir
作用
AOF持久化文件保存路径,与RDB持久化文件保持一致即可

AOF重写

随着命令不断写入AOF,文件会越来越大,为了解决这个问题,Redis引入了AOF重写机制压缩文件体积。
AOF文件重写是将Redis进程内的数据转化为写命令同步到新的AOF文件的过程。
简单说就是将同一个数据的若干条命令执行结果转化成最终结果数据对应的指令进行记录。

AOF重写作用

降低磁盘占用量,提高磁盘利用率
提高持久化效率,降低持久化写时间,提高IO性能
降低数据恢复复用时,提高数据恢复效率

AOF重写规则

  1. 进程内已超时的数据不再写入文件
  2. 忽略无效指令,重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令
    如 del key1,hdel key2,srem key3,set key4 111,set key4 222等
  3. 对同一数据的多条写命令合并为一条命令
    如lpush list1 a,lpush list1 b,lpush list1 c可以转化为lpush list1 a b c
  4. 为防止数据量过大造成客户端缓冲区溢出,对list,set,hash,zset等类型,每条指令最多写入64个元素

AOF重写方式

手动重写
bgrewriteaof
自动重写
auto-aof-rewrite-min-size size 限制空间最小值
auto-aof-rewrite-percentage percentage 百分比
AOF手动重写 - bgrewriteaof指令工作原理
1.发送指令
2.调用fork函数生成子进程
3.重写aof文件
4.返回消息

RDB和AOF区别

持久化方式RDBAOF
占用存储空间小(数据级:压缩)大(指令级:重写)
存储速度
恢复速度
数据安全性会丢失数据依据策略决定
资源消耗高/重量级低/轻量级
启动优先级
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值