Redis相关知识梳理

在这里插入图片描述

安装redis

个人学习,此处推荐docker安装,参考docker安装redis

redis基础知识

  1. redis默认是16个数据库,默认使用第一个,可以用select切换。
[root@localhost ~]# docker exec -it redis /bin/bash
root@3cc572b8971a:/data# redis-cli
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>
  1. redis是单线程的,redis是基于内存操作的,cpu不是redis的性能瓶颈,redis的瓶颈是机器内存和网络带宽。

常用指令

> flushall #清空缓存

数据类型

Redis是开源的,内存中的数据结构存储系统。可以用作数据库、缓存和消息中间件。支持多种类型的数据结构,包括5大基础数据类型和3大特殊数据类型。

5大基础数据类型

String

String应该是用得最多的数据类型,用来缓存个什么东西很方便。常说不会用redis的就只会用个String来当缓存用。万物都存储在String里面。

常用命令:

1. set key value #设置KV
2. get key #获取K对应的V
3. keys * #获取所有的Key
4. exits key #判断Key是否存在
5. MOVE key db #移动一个key到对应的db里面去
6. DEL key [key ...] #移除key
7. incr key # key对应的value自增1,不存在key则会创建
8. decr key #key对应的value自减1,不存在key则会创建
9. incrby key num 
10. decrby key num
11. getrange key start end #获取value的子串
12. setrange key offset value #将key的value从offset位置修改成value
13. setex #设置key的过期时间
14. setnx #不存在则set,存在则不set(常用分布式锁)
15. mset #批量设置kv 
16. mget #批量获取kv
17. msetnx #同时设置多个kv,一个失败则全失败。
18. getset #获取旧的值,同时设置新的值

List

List实际上是一个队列。
常用命令:

1. lpush #一个或多个value从对头入列
2. rpush #一个或多个value从队尾入列
3. LRANGE key start stop # 获取度列中从start到stop的元素列表
4. LINDEX key index # 通过下标获取一个元素
5. llen key # 获取集合长度
6. lpop key #队头取出一个元素
7. LREM key count element # 从list中移除count个element 元素
8. ltrim key start stop # 截取start到stop的元素
9. rpoplpush source dest # source pop 然后push到dest
10. LSET key index element # 设置index位置的值
11. LINSERT key BEFORE|AFTER pivot element # 往key指定元素pivot之前或之后插入指定的元素

Set

常用命令:

1. SADD key member [member ...] # 添加一个或多个元素
2. SMEMBERS key # 获取所有的元素
3. SISMEMBER key member # 判断member是否在集合中
4. SCARD key # 获取集合中元素个数
5. SRANDMEMBER key [count] #从集合中随机获取count个元素
6. SREM key member [member ...]#从集合中移除指定元素
7. SPOP key [count] #从集合中移除并返回count个成员
8.  SMOVE source destination member # 将source中的member移动到destination中
9. SDIFF key [key ...] # 前面集合减去后面集合
10. SINTER key [key ...]# 多个集合相交
11. SDIFFSTORE destination key [key ...] #将多个集合的交集写入到destination中
12. SINTERSTORE destination key [key ...] #将多个集合的并集写入到destination中

Map

map中field唯一不重复
常用命令:

1. HSET key field value [field value ...] #设置map的field和value 
2. HMSET key field value [field value ...] #设置Map的filed和value,和HSET的差别在于HSET会返回插入的元素个数,如果fileld已经存在则返回0
3.  HGET key field #获取对应的field的值
4. HMGET key field [field ...] #获取多个field的值 
5. HGETALL key #获取所有的field和值
6. HLEN key #获取map的大小
7. HEXISTS key field #判断field是否存在
8. HVALS key #获取所有的值
9. HINCRBY key field increment #将哈希字段的整数值递增给定的数字
10. HSETNX key field value #当field不存在是设置值

ZSet

zset中member不唯一,可重复

1. ZADD key score member [score member ...] # 将一个或多个成员添加到排序集,或更新其分数(如果已存在)
2. ZRANGE key min max [WITHSCORES] # 返回排序集中的成员
3.  ZRANGEBYLEX key min max [LIMIT offset count] # 按字典顺序返回,注意参数min和max必须带(或[,如:zrangebylex mz (1 [z   
4. ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] #按分数返回,注意,这里的min和max不需要(和[,如:zrangebyscore mz 1.0 2.0
5. ZREVRANGE key start stop [WITHSCORES] # 分数从高到低排列返回
6. ZREM key member [member ...]#移除指定元素
7. ZCOUNT key min max #统计范围内的成员数量

3大特殊数据类型

geospatital地理位置

使用场景:朋友圈定位,附近的人,打车距离
命令:

1. GEOADD key longitude latitude member [longitude latitude member ...]#录入一个或多个经纬度点信息,两级无法添加。
2.  GEOHASH key member [member ...] #以标准的geohash字符串返回成员的位置信息
3. GEOPOS key member [member ...] # 返回地理空间上的经纬度
4. GEODIST key member1 member2 [M|KM|FT|MI] #返回两个成员之间在地理位置上的距离
5. GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]# 查询表示地理空间索引的已排序集,以获取与某个点的给定最大距离匹配的成员
6. GEORADIUSBYMEMBER key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key] # 查询表示地理空间索引的已排序集,以获取与成员之间的给定最大距离匹配的成员

Hyperloglog

基数统计算法

基数:不重复的元素个数

优点:

占用内存固定,2^64不同元素的数据,只需要12kb的内存。

缺点:

有0.81%的错误率。

场景:

统计网页的UV(用户访问数)

命令:

1. PFADD key [element [element ...]] #添加元素
2. PFCOUNT key [key ...] # 返回基数
3. PFMERGE destkey sourcekey [sourcekey ...] #合并多个基数集合

BitMap

位图,按位存储状态(0/1)
命令:

1. SETBIT key offset value #设置或清除键处存储的字符串值中偏移量处的位
2. GETBIT key offset #获取指定偏移量的值
3. BITCOUNT key [start end [BYTE|BIT]] #统计指定区间的总和

sort指令

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

注意:sot 默认使用数字进行排序,如果是字符串需要加ALPHA参数,否则会报错

Redis的排序命令使用(Sort)

事务

redis单条命令保证原子性,但事务不保证原子性。

redis事务:

  1. 开启事务(multi)
  2. 命令入队
  3. 执行事务(exec)

示例:

127.0.0.1:6379> multi 
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) "v1"

取消事务:discard
异常:

  • 编译异常:事务中所有的命令都不会执行。
  • 运行时异常:不影响其他命令执行。

示例

##编译异常
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> cls
(error) ERR unknown command 'cls', with args beginning with: 
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.

##运行时异常
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1 
QUEUED
127.0.0.1:6379(TX)> incr k1
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) "v1"

监控,watch实现

两个线程执行:
p1:

127.0.0.1:6379> get money
"80"
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> decrby money 10
QUEUED
127.0.0.1:6379(TX)> incrby out 10
QUEUED
# 在p1执行之前,执行p2,然后再执行p1会发现p1执行失败
127.0.0.1:6379(TX)> exec
(nil)

p2

127.0.0.1:6379> get money
"80"
127.0.0.1:6379> set money 100
OK

reids配置

通用配置

  1. 容量单位大小写不敏感

  2. 通过inclue可以将多个配置文件读取进来

  3. bind绑定ip

  4. port指定端口

  5. daemonize设置是否以守护进程的方式运行

  6. pidfile如果时守护进程方式运行就需要设置pidfile(/var/run/redis_6379.pid),启动时生产,退出时删除

  7. 日志级别loglevel

     # debug (a lot of information, useful for development/testing)
     # verbose (many rarely useful info, but not a mess like the debug level)
     # notice (moderately verbose, what you want in production probably)
     # warning (only very important / critical messages are logged)
    
    
    
  8. 日志文件logfile,默认为空表示不生成日志文件,如果不设置,以守护程序启动,日志文件会输出到/dev/null

  9. databases 数据库数量,默认16个

  10. always-show-logo yes;是否显示logo

快照

持久化:在规定时间内,执行多少次操作,则会持久化到文件 .rdb .aof

1.save

save 900 1  #如果900秒内如果一个key进行了修改,则进行持久化
save 300 10 #300秒内10个key进行了修改,进行持久化
save 60 10000


#在持久化失败时是否继续运行
stop-writes-on-bgsave-error yes
#是否压缩rdb文件
rdbcompression yes
#持久化时是否检查rdb文件
rdbchecksum yes
#rdb文件名称
dbfilename dump.rdb
#rdb文件目录
dir ./

REPLICATION 主从复制

SECURITY

requirepass psw #设置密码
rename-command #重命名命令名称,在共享环境下重命名一些危险的命令,重命名为''则可以禁用一些命令

CLIENTS限制

 maxclients 10000 #现在最多允许10000(默认值)个客户端同时连接

MEMORY MANAGEMENT 内存管理

maxmemory <bytes>  #设置一个内存的限定字节数。当达到限制大小,redis会尝试移除keys。
maxmemory-policy noeviction#内存满后的移除策略
# volatile-lru -> 在过期集合中采用lru策略进行移除
# allkeys-lru -> 所有的key集合中采用lru策略移除
# volatile-lfu -> 设有过期时间的key集合中采用lfu策略移除
# allkeys-lfu -> 所有的key集合中采用lfu策略移除
# volatile-random -> 在设有过期时间的key集合中随机移除
# allkeys-random -> 所有key集合中随机移除
# volatile-ttl -> 移除最近过期的key
# noeviction -> 不做任何处理,仅在写操作时返回一个错误信息
 maxmemory-samples 5 #移除时并非全量进行lru,会取用部分样本进行算法计算,该配置设置样本数大小。
 replica-ignore-maxmemory yes #副本是否忽略内存管理配置(redis 5开始,副本将忽略该配置)

LRU是最近最少使用页面置换算法,淘汰最长时间未被使用的页面;而LFU是最近最不常用页面置换算法,淘汰一定时期内被访问次数最少的页。LRU关键是看页面最后一次被使用到发生调度的时间长短;而LFU关键是看一定时间段内页面被使用的频率

样本数默认值为5会产生足够好的结果。10非常接近真正的LRU,但需要更多的CPU。3更快,但不是很准确。

APPEND ONLY MODE(AOF模式)

appendonly no #默认不开启,默认使用rdb方式持久化,在大部分情况下rdb完全够用。
appendfilename "appendonly.aof"#持久化的文件名字
# appendfsync always  #每次修改都会同步,消耗性能
appendfsync everysec # 每秒执行一次同步,可能会丢失这1s的数据
# appendfsync no     #关闭同步

Redis持久

redis是内存数据库,所以必须持久化才能保存数据状态。

持久化有两种方式:rdb和AOF;

rdb

rdb保存的文件时dump.rdb,rdb是快照。

rdb持久化触发机制:

  1. save规则满足;
  2. 执行flushall命令;
  3. 退出redis也会产生rdb文件。

AOF

将所有的命令以日志的形式将所有的写操作记录下来,在启动的时候重新执行写操作。

默认时不开启的,需要手动开启。

保存的文件是appendonly.aof。

如果aof文件被意外篡改了,用redis-check-rdb工具进行修复。修复方式就是把错误的日志命令移除!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值