Redis
2021-07-07 14:11:04 41 举报
AI智能生成
Redis是一个开源的,基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、列表、集合、散列和有序集合。Redis具有高性能、高可用性和可扩展性的特点,适用于各种应用场景。它具有丰富的特性,如持久化、事务、发布订阅、管道等,能够满足不同需求。Redis采用单线程模型来处理客户端的请求,通过异步非阻塞的方式来提高性能。它还提供了多种编程语言的客户端库,方便开发者进行访问和操作。总之,Redis是一个功能强大且灵活的数据存储解决方案,被广泛应用于互联网行业。
作者其他创作
大纲/内容
Redis概述
1.什么是Redis
Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。
Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统
它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。
2. Redis特点
Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。
以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。
Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。
Redis的存储分为内存存储、磁盘存储和log文件三部分,
重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置。
Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。
3. Redis应用场景
众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,
这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。
拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。
要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。
上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,
要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。
1.安装包下载
Redis官网下载页面: http://redis.io/download
Windows下Redis项目: https://github.com/MSOpenTech/redis
2.解压
1.redis-benchmark.exe #基准测试
2.redis-check-aof.exe # aof
3.redis-check-dump.exe # dump
4.redis-cli.exe # 客户端
5.redis-server.exe # 服务器
6.redis.windows.conf # 配置文件
3.安装运行
单实例运行
手动运行
redis-server.exe redis.windows.conf
服务运行
安装redis服务
redis-server --service-install redis.windows.conf --loglevel verbose命令注册服务
启动redis服务
redis-server --service-start开启服务
卸载redis服务
redis-server.exe --service-uninstall
客户端运行
redis-cli.exe 默认访问6379端口
redis-cli.exe -p 6380 访问指定的端口6380
主从复制
在一台机器上启动多个redis实例。需要将默认的redis.conf文件复制一份,然后修改一下对应的设置,保证多个redis实例不出现共享数据就可以了。
master主机配置
bind 127.0.0.1
port 6379
dbfilename dump.rdb
slave从机配置
bind 127.0.0.1
port 6380
dbfilename dump80.rdb
slaveof 127.0.0.1 6379
redis持久化
RDB的配置和原理
快照(snapshotting)
相关配置
原理
当条件满足,redis需要执行RDB的时候,服务器会执行以下操作:
1. redis调用系统函数fork() ,创建一个子进程。
2.子进程将数据集写入到一个临时 RDB 文件中。
3.当子进程完成对临时RDB文件的写入时,redis 用新的临时RDB 文件替换原来的RDB 文件,并删除旧 RDB 文件。
RDB的优点
1.RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。
这种文件非常适合用于进行备份和灾难恢复。
2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
3.RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
RDB缺点
1.如果你需要尽量避免在服务器故障时丢失数据,那么RDB 不适合你。
虽然Redis 允许你设置不同的保存点(save point)来控制保存 RDB 文件的频率,
但是, 因为RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。
因此你可能会至少 5 分钟才保存一次 RDB 文件。
在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。
2.每次保存 RDB 的时候,Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。
在数据集比较庞大时, fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端;
如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。
虽然 AOF 重写也需要进行 fork() ,但无论 AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失。
AOF的配置和原理
只追加操作的文件(Append-only file,AOF)
相关配置
原理
快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。
从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。
你可以在配置文件中打开AOF方式:
appendonly yes
从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件的末尾。这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。
redis的数据淘汰机制
volatile-lru :从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl :从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random :从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru :从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random :从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction (驱逐):禁止驱逐数据
使用策略规则
1.如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
2.如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
数据淘汰策略
ttl和random比较容易理解,实现也会比较简单。主要是Lru最近最少使用淘汰策略,设计上会对key 按失效时间排序,然后取最先失效的key进行淘汰
4.Redis Client
核心接口
Jedis
JedisPoolConfig
JedisPool
核心方法
添加数据
jedis.set("jeffrey", "1234567");
获取数据
jedis.get("jeffrey")
修改数据
jedis.append("jeffrey", ",hello");
覆盖原有数据
jedis.set("jeffrey", "yang");
删除数据
jedis.del("jeffrey");
key-value 数组存储
jedis.msetnx("jeffrey", "yang", "password", "123456");
数组提取
jedis.mget("jeffrey", "password")
map数据
jedis.hmset("user", user);
jedis.hmget("user", "name", "pwd");
jedis.hlen("user")
jedis.hexists("user", "pwd")
jedis.hkeys("user")
jedis.hvals("user")
5.与spring集成
方向1:解决Session共享问题
方向2:redis作为数据库使用
NoSql
redis数据类型
5种数据类型
分支主题
list数据类型
1.用做堆栈
图示
分支主题
lpush
lrange
示例
2.用做队列
图示
分支主题
RPUSH
示例
常用方法
关于lrang的用法
语法:lrang start stop
情况一:0通常表示第一个元素 1则是表示第二个,依次类推
情况二:-1表示最后一个元素 -2则表示最后一个元素之前的元素,依次类推
out of rang indexs不是一个错误:
如果start > end: 返回一个empty of list
如果end > 实际的最后一个值,则默认返回最大的值。(end为实际的end)
关于lpop的用法
语法:lpop key | 表示出栈/出队列中的第一个元素,并从原来的list集合中删除该元素
关于LREM的用法
语法:lrem key count value
删除count个值元素值为value的数据,返回被删除的元素数量。
*count>0 从头往后删除 count<0从尾往前删除
关于lset的用法
语法:lset key index value
设置链表中指定位置为新值
关于lindex的用法
语法:lindex key index
返回链表中指定下标的值
关于ltrim的用法
语法: ltrim key start stop
保留指定范围内的元素
redis的使用场景
添加缓存的逻辑的原则:缓存逻辑不能影响正常的业务逻辑执行
场景一:短信验证
短信校验是常用到的一项保证安全的,短信的验证码都是随机产生的,
而且信息都是有时间限制的,一旦过了那个时间的有效期,验证信息就会自动删除。
图例
分支主题
代码
Redis中事务
1、常用命令
multi
标识一个事务的开始
exec
执行某事务块内的所有命令
watch key…
监视一个或多个key,如果在事务执行之前这些被监视的key被其他命令修改,这该事务则被取消
unwatch
取消watch命令对所有key的监视
discard
放弃执行事务
2、实例操作
步骤
声明事务
命令入队(一个或多个命令)
执行事务
示例1
声明并执行事务
代码
实例2
取消事务
代码
示例3
利用两个客户端演示watch命令
代码
自由主题
0 条评论
下一页