Redis入门(一)

Redis介绍

Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
本质是客户端-服务器端应用软件程序。
特点是使用简单、性能强悍、功能应用场景丰富。

下载安装,

官方地址官方下载地址

$ cd /usr/local
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make

运行

现在编译的二进制文件在src 目录中可用 。运行Redis:

$ src/redis-server

您可以使用内置客户端与Redis进行交互:

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
redis> del foo
(integer) 1
redis> del foo
(integer) 0
redis> get foo
(nil)
redis> set foo bar
OK
redis> set foo bar1
OK
redis> keys *
1) "foo"
redis> type foo
string

警告处理

在这里插入图片描述


# warning 1 > 提示修改 linux内核参数
# WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
echo 1024 >/proc/sys/net/core/somaxconn

# warn 2 > 提示如下
# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1

# warning 3
# WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled
echo never > /sys/kernel/mm/transparent_hugepage/enabled

各命令官网地址命令介绍https://redis.io/commands
Redis中文

常用客户端

Redisson
Jedis
lettuce

Spring redis

Spring文档

redis持久化

RDB

  • RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。
    在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中。你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。你也可以通过调用 SAVE或者 BGSAVE , 手动让 Redis 进行数据集保存操作。

比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:
120秒有1000次也会触发,60秒是扫描频率,你可以配置多个策略

save 900 1
save 300 10
save 60 10000

当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:

Redis 调用forks. 同时拥有父进程和子进程。
子进程将数据集写入到一个临时 RDB 文件中。
当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。

AOF

只追加操作的文件(Append-only file,AOF)
AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。
打开AOF方式

appendonly yes

Redis 2.4 则可以自动触发 AOF 重写。Redis之AOF重写及其实现原理这篇博客不错

#AOF文件大小和最后一次重写后的大小指定的增长百分比
auto-aof-rewrite-percentage 100
#当前AOF文件大小要大于64m
auto-aof-rewrite-min-size 64mb

redis内存分配

redis对不同数据类型的大小限制

  • String 类型:value最大可以存储512M
  • Lists类型:最多可以存储元素个数为2^32-1个
  • Sets类型:最多可以存储元素个数为2^32-1个
  • Hashes类型:最多可以存储元素个数为2^32-1个

最大内存的控制

参考地址http://www.redis.cn/topics/lru-cache.html
过期数据处理主要分为

  • 主动处理(redis主动触发检测key是否过期)每秒执行10次。(抽取)
  • 被动处理:每次访问key的时候,发现超时后被动过期,清理掉。
    maxmemory 最大内存阈值 64位系统 默认是0, 32位系统默认是3GB
    maxmemory-policy 到达阈值的执行回收策略
    通过redis.conf可以设置该指令,或者之后使用CONFIG SET命令来进行运行时配置。
回收策略描述
noeviction当内存限制达到并且客户端尝试执行会让更多内存被使用的命令,直接报错
allkeys-lru尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
volatile-lru尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
allkeys-random回收随机的键使得新添加的数据有空间存放。
volatile-random回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
volatile-ttl回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
volatile-lfu回收在过期集合的键,使用近似LFU进行回收。根据使用频率
allkeys-lfu针对所有键,使用近似LFU回收。根据使用频率
  • LRU (Least recently used) 最近最少使用,如果数据最近被访问过,那么将来被访问的几率也更高。
  • LFU (Least frequently used) 最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。从Redis 4.0开始,可以使用新的最少使用的删除模式。中文网上还没有。
  • FIFO (Fist in first out) 先进先出, 如果一个数据最先进入缓存中,则应该最早淘汰掉。
    Redis的LRU算法并非完整的实现。对keys进行抽样回收。抽样数量可以调整 。
    #抽样比例为50%
    maxmemory-samples 5
    在这里插入图片描述
    LFU近似于LRU:它使用概率计数器,称为Morris计数器,以便仅使用每个对象的几个位来估计对象访问频率,并结合衰减周期,以便计数器随时间减少。
    两个配置参数
    #对数因子,使频率计数器饱和所需的命中数,数值见下表
    lfu-log-factor 10
    #衰减时间,计数器应该被衰减的分钟数,特殊值0意味着:每次扫描都会使计数器衰减
    lfu-decay-time 1
    因子越高,为了达到最大值,需要的访问次数越多。根据下表,因子越低,低访问计数器的分辨率越高:在这里插入图片描述
    启用LFU算法后,可以使用热点数据分析功能(redis-cli --hotkeys)

内存压缩(内存优化)

Redis2.2版本及以后,存储集合数据的时候会采用内存压缩技术,以使用更少的内存存储更多的数据。用CPU换内存,理论上可以节省10倍以上内存(平均节省5倍以上内存)。小于配置的阈值时进行压缩,大于这些阈值数据量太大就不适合压缩了,消耗CPU太多。

#hash配置字段最多512个压缩
hash-max-zipmap-entries 64 (2.6以上使用hash-max-ziplist-entries)
#hash配置value512子节
hash-max-zipmap-value 512  (2.6以上使用hash-max-ziplist-value)
list-max-ziplist-entries 512
list-max-ziplist-value 64
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
set-max-intset-entries 512

大小超出压缩范围,溢出后将自动转换为正常大小

Redis集群

Redis集群教程
集群使用了主从复制模型,每个节点都会有N-1个复制品。
Redis 并不能保证数据的强一致性。 这意味这在实际中集群在特定的条件下可能会丢失写操作。
第一个原因是因为集群是用了异步复制。 写操作过程:
客户端向主节点B写入一条命令.
主节点B向客户端回复命令状态.
主节点将写操作复制给他得从节点 B1, B2 和 B3.

#replicaof <masterip> <masterport>
#或slaveof  <masterip> <masterport>
slaveof 192.168.1.199 6379

在这里插入图片描述
在这里插入图片描述

主从复制注意事项

  • 读写分离场景:
    1、数据复制延迟导致读到过期数据或者读不到数据(网络原因、slave阻塞)
    2、从节点故障(多个client如何迁移)
  • 全量复制情况下:
    1、第一次建立主从关系或者runid不匹配会导致全量复制
    2、故障转移的时候会出现全量复制
  • 复制风暴:
    1、 master故障重启,如果slave节点较多,所有slave都要复制,对服务器的性能,网络的压力都有很大影响。
    2、 如果一个机器部署了多个master
  • 写能力有限
    主从复制还是只有一台master,提供的写服务能力有限
  • master故障情况下:
    1、如果是master无持久化,slave开启持久化来保留数据的场景,建议不要配置redis自动重启。
    2、启动redis自动重启,master启动后,无备份数据,可能导致集群数据丢失的情况
    拷贝从库的快照或aof文件到mster重启。或手动切换主从。
  • 带有效期的key:
    1、slave不会让key过期,而是等待master让key过期
    2、在lua脚本执行期间。不执行任何key过期操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值