Redis知识点总结

举报
Leef724 发表于 2020/06/20 17:10:13 2020/06/20
【摘要】 1 启动redis redis-server redis.conf2 停止redis redis-cli SHUTDOWN ./redis-cli -h 127.0.0.1 -p 7000 -a sqoop SHUTDOWN3 登录redis redis-cli 提示:(error) NOAUTH Authentication requi...

1      启动redis

   redis-server redis.conf

2      停止redis

   redis-cli SHUTDOWN  

   ./redis-cli -h 127.0.0.1 -p 7000 -a sqoop SHUTDOWN

3      登录redis

    redis-cli 提示:(error) NOAUTH Authentication required. 这是需要密码,可以输入以下命令

    auth sqoop  -->sqoop是密码

    redis-cli  -a password 可以带密码登入 -c 参数支持重定向

    redis-cli -c -h 192.168.1.214 -p 6379 -a sqoop

4      集群安装

4.1      下载redis,安装redis

   cd /data/redis-server                

   tar -zxvf redis-4.0.1.tar.gz

   cd redis-4.0.1

   make && make install  

4.2      redis-4.0.1目录下 创建目录

   mkdir redis_cluste

   cd redis_cluste

 

   mkdir 7000 7001 7002 7003 7004 7005

   cd redis-4.0.1

   cp redis.conf redis_cluster/7000

    ...

   cp redis.conf redis_cluster/7005

4.3      修改各节点下的redis.conf文件如下

   port:7000   

   daemonize   yes

   pidfile  /var/run/redis_7000.pid

   cluster-enabled yes

   cluster-config-file nodes-7000.conf

   logfile "/home/Ruby/logs/redis/redis_7000.log"

   masterauth sqoop

  

4.4      启动各节点

   ./redis-server ../redis_cluster/7000/redis.conf

    ...

   ./redis-server ../redis_cluster/7005/redis.conf

4.5      创建集群

   find / -name 'client.rb'

   vi /usr/local/share/gems/gems/redis-3.2.1/lib/redis/client.rb 中的DEFAULTS.password masterauth参数配的密码

   redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

5      主备安装

5.1      redis-4.0.1目录下 创建目录

   mkdir redis_replica

   cd redis_replica

 

   mkdir master slave

  

   cd redis-4.0.1

   cp redis.conf redis_replica/master

   cp redis.conf redis_replica/slave

5.2      修改主节点下的redis.conf文件如下

   port:7006   

   daemonize   yes

   pidfile  /var/run/redis_7006.pid

   logfile "/home/Ruby/logs/redis/redis_7006.log"

   masterauth sqoop

   requirepass sqoop

5.3      修改从节点下的redis.conf文件如下

   port:7007

   daemonize   yes

   slaveof 192.168.1.214 7006

   pidfile  /var/run/redis_7007.pid

   logfile "/home/Ruby/logs/redis/redis_7007.log"

   masterauth sqoop

   requirepass sqoop

6      Move All Keys Matching Pattern

   eg : from 0 to 1

   redis-cli --raw keys "$PATTERN" | xargs -L1 -I{} redis-cli move {} 1  

7      查看当前Cluster的节点情况  

   cluster nodes

8      统计key的个数

·         redis-cli -h 189.120.84.149 -p 6379 -a sqoop keys 'mon_person*' |wc -l

·         dbsize

9      批量删除

   慢删

   redis-cli -a ${password} keys "*" | xargs redis-cli -a ${password} del 

   快速删

   redis-cli -h ${host} -p ${port} -a ${password} --raw keys "$pattern" | xargs redis-cli -h ${host} -p ${port} -a ${password} del

  

   举例

   redis-cli -h 192.168.1.214 -p 7000 -a sqoop keys '*' |xargs -I {} echo '"{}"'|xargs redis-cli -h 192.168.1.214 -p 7000 -a sqoop del

 

   redis-cli -h 189.120.84.149 -p 6379 -a sqoop keys 'test_ljh*' |xargs -I {} echo '"{}"'|xargs redis-cli -h 189.120.84.149 -a sqoop del

10 清空当前数据库中的所有 key

FLUSHDB

11  批理随机生成key  

   redis-benchmark -h 192.168.1.214 -p 6379 -a  sqoop -c 50 -d  128  -r 6316 -t SET

12  Redis 禁用某些命令

   (error) ERR unknown command 'CONFIG'

   redis.conf中增加,比如禁用config命令: rename-command config ""

13  maxmemory-policy 参数说明

   在达到内存上限(maxmemory)时DCS将如何选择要删除的内容。有6个取值供选择:

   volatile-lru:根据LRU算法删除设置了过期时间的键值。

   allkeys-lru:根据LRU算法删除任一键值。

   volatile-random:删除设置了过期时间的随机键值。

   allkeys-random:删除一个随机键值。

   volatile-ttl:删除即将过期的键值,即TTL值最小的键值。

   noeviction:不删除任何键值,只是返回一个写错误  

14  过期时间

  命令格式: EXPIRE key seconds  

  返回: 成功返回 1 失败或是键不存返回 0

 

  PEXPIRE

15  一个键还有多久的时间会被删除

   命令格式:TTL key 

   返回: 成功返回 存续时间秒数, 键不存返回 -2 永久存在的键返回 -1

16  判断一个键是否存在

   命令格式: EXISTS key

   返回: 存在返回 1 不存返回 0

17  事务

17.1   先发送MULTI命令(无参)

17.2   再依次发送需要执行的各种命令

17.3   发送EXEC 命令(无参)

17.4   集群不支持事务,但可以直接连单个master节点使用事务,如果是写操作需要注意keyslot 是在同一节点上

18  查看key对应的slot

  cluster keyslot "key"

19  查看slot和节点的对应关系
cluster slots

20  Disadvantages of partitioning(分区的缺点)

Some features of Redis don't play very well with partitioning:

Redis的某些功能在分区中不能很好地发挥作用:

·         Operations involving multiple keys are usually not supported. For instance you can't perform the intersection between two sets if they are stored in keys that are mapped to different Redis instances (actually there are ways to do this, but not directly).

操作涉及多个键时通常不支持。例如,如果两个集合的key存储在不同Redis实例中,那么您将无法得到它们的交集(实际上,有很多方法可以执行此操作,但不能直接执行)

·         Redis transactions involving multiple keys can not be used.

事务涉及多个key 时无法使用。

·         The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set.

分区粒度是关键,因此无法将单个数据集大键(如非常大的排序集)进行分片.

·         When partitioning is used, data handling is more complex, for instance you have to handle multiple RDB / AOF files, and to make a backup of your data you need to aggregate the persistence files from multiple instances and hosts.

使用分区时,数据处理会更加复杂,例如,您必须处理多个RDB / AOF文件,并且要备份数据,则需要从多个实例和主机聚合持久性文件。

·         Adding and removing capacity can be complex. For instance Redis Cluster supports mostly transparent rebalancing of data with the ability to add and remove nodes at runtime, but other systems like client side partitioning and proxies don't support this feature. However a technique called Pre-sharding helps in this regard.

添加和删除容量可能很复杂。例如,Redis Cluster支持大多数透明的数据重新平衡,并能够在运行时添加和删除节点,但是其他系统(例如客户端分区和代理)不支持此功能。但是,在这方面,一种称为“ 预分片的技术会有所帮助

21  Bigkey

21.1   bigkey查看方法

   redis-cli -p 6380 --bigkeys  

需要注意的是,这个bigkeys得到的最大,不一定是最大。说明原因前,首先说明bigkeys的原理,非常简单,通过scan命令遍历,各种不同数据结构的key,分别通过不同的命令得到最大的key

·         如果是string结构,通过strlen判断

·         如果是list结构,通过llen判断

·         如果是hash结构,通过hlen判断

·         如果是set结构,通过scard判断

·         如果是sorted set结构,通过zcard判断。

21.2   Set类型的 bigkey如何抽取

image.png 

21.3   ZSet 类型的bigkey如何抽取

21.3.1    使用 zrange

image.png

21.3.2    使用zscan

image.png 

21.4   Hash类型的bigkey如何抽取


image.png

21.5   List类型的bigkey如何抽取

image.png

22Redis内存不足的缓存淘汰策

  • noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键

  • allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键

  • volatile-lru:加入键的时候如果过限,首先从设置了过期时间的键集合中驱逐最久没有使用的键

  • allkeys-random:加入键的时候如果过限,从所有key随机删除

  • volatile-random:加入键的时候如果过限,从过期键的集合中随机驱逐

  • volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键

  • volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键

  • allkeys-lfu:从所有键中驱逐使用频率最少的键

 

23  LRU & LFU

LRULeast Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。

LFULeast Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。

LRU的最近最少使用实际上并不精确,考虑下图的情况,如果在|处删除,那么A距离的时间最久,但实际上A的使用频率要比B频繁,所以合理的淘汰策略应该是淘汰BLFU就是为应对这种情况而生的。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。