什么是redis
官方的解释如下:
常用的场景如下:
-
热点数据的缓存
由于redis访问速度块、支持的数据类型比较丰富,所以redis很适合用来存储热点数据,另外结合expire,我们可以设置过期时间然后再进行缓存更新操作,这个功能最为常见,我们几乎所有的项目都有所运用。 -
限时业务的运用
redis中可以使用expire命令设置一个键的生存时间,到时间后redis会删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景。 -
计数器相关问题
redis由于incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。 -
排行榜相关问题
关系型数据库在排行榜方面查询速度普遍偏慢,所以可以借助redis的SortedSet进行热点数据的排序。 -
点赞、好友等相互关系的存储
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。 又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能。 -
队列
由于redis有list push和list pop这样的命令,所以能够很方便的执行队列操作。
redis的安装
redis官网地址如下–>下载地址
windows系统下的安装
Redis官方并没有提供Windows版本的安装包,只提供了linux的,所以我们只能github上下载,但是github上的版本已经很久没有维护了,版本已经很旧了—>下载地址
下载后解压如下:
linux系统下的安装
1、进入官网下载:
2、将下载好的压缩包上传到服务器,我用的是Xshell和Xftp,我上传到了usr这个目录(这里使用的是阿里云服务器)
3、解压缩文件,使用命令tar -zvxf redis-6.2.5.tar.gz,解压后当前路径会出现redis-6.2.5这个目录,将其移至 usr/local/redis,里面的文件如下
4、进入 src目录,执行make install命令
报错说明缺少环境依赖,按次序执行以下命令:
- yum install cpp
- yum install binutils
- yum install glibc
- yum install glibc-kernheaders
- yum install glibc-common
- yum install glibc-devel
- yum install gcc
- yum install make
如果还报错
FATAL ERROR: JEMALLOC/JEMALLOC.H: NO SUCH FILE OR DIRECTORY
加上make MALLOC=libc,再执行make install,如果想指定安装好后的可执行文件的路径用make PREFIX=你想放的路径 install
5、安装完后可执行文件默认放在 usr/local/bin目录下,查看是否有下面文件,有就说明安装成功
测试连接
windows:
- 先打开 redis-server.exe
- 打开 redis-cli.exe,输入 ping,如果显示pong则成功
linux:
- 进入redis的可执行文件目录
- 输入 redis-server …/redis/redis.conf (这里填你自己的配置文件路径)
3、输入 redis-cli,再输入ping
redis的五种基本类型使用
字符串(String)
- SET key value (设置指定 key 的值)
- GET key (获取指定 key 的值)
- GETRANGE key start end (返回 key 中字符串值的子字符)
- GETSET key value (将给定 key 的值设为 value ,并返回 key 的旧值(old value))
- MSET key value [key value …] (同时设置一个或多个 key-value 对)
- MSETNX key value [key value …] (同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在)
- MGET key1 [key2…] (获取所有(一个或多个)给定 key 的值)
- SETEX key seconds value (将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位))
ttl用来查看过期时间,为-2说明过期 - SETNX key value (只有在 key 不存在时设置 key 的值)
- INCR key (将 key 中储存的数字值增一)
- INCRBY key increment (将 key 所储存的值加上给定的增量值(increment))
- DECR key (将 key 中储存的数字值减一)
- DECRBY key decrement (key 所储存的值减去给定的减量值(decrement))
- STRLEN key (返回 key 所储存的字符串值的长度)
- APPEND key value (如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾)
- del key [key …] (删除一个或者多个key)
哈希(Hash)
Redis hash 是一个 string 类型的 field(字段)和 value(值)的映射表,hash 特别适合用于存储对象
- HSET key field value (将哈希表 key 中的字段 field 的值设为 value)
- HGET key field (获取存储在哈希表中指定字段的值)
- HGETALL key (获取在哈希表中指定 key 的所有字段和值)
- HDEL key field1 [field2] (删除一个或多个哈希表字段)
- HEXISTS key field (查看哈希表 key 中,指定的字段是否存在)
- HINCRBY key field increment (为哈希表 key 中的指定字段的整数值加上增量 increment)
- HKEYS key (获取所有哈希表中的字段)
- HLEN key (获取哈希表中字段的数量)
- HMSET key field1 value1 [field2 value2 ] (同时将多个 field-value (域-值)对设置到哈希表 key 中)
- HMGET key field1 [field2](获取所有给定字段的值)
- HDEL key field1 [field2] (删除一个或多个哈希表字段)
- HSETNX key field value(只有在字段 field 不存在时,设置哈希表字段的值)
- HVALS key(获取哈希表中所有值)
列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
- LPUSH key value1 [value2] (将一个或多个值插入到列表头部)
- LRANGE key start stop (获取列表指定范围内的元素)
- LINDEX key index (通过索引获取列表中的元素)
- LINSERT key BEFORE|AFTER pivot value(在列表的元素前或者后插入元素)
- LLEN key (获取列表长度)
- LPOP key [count] (移出并获取列表count个元素)
- BLPOP key1 [key2 ] timeout (移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止)
- BRPOP key1 [key2 ] timeout (移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止)
- LSET key index value (通过索引设置列表元素的值)
- LREM key count value (移除列表元素)
- LTRIM key start stop (对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除)
集合(Set)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
- SADD key member1 [member2] (向集合添加一个或多个成员)
- SCARD key (获取集合的成员数)
- SMEMBERS key (返回集合中的所有成员)
- SPOP key (移除并返回集合中的一个随机元素)
- SREM key member1 [member2] (移除集合中一个或多个成员)
- SINTER key1 [key2] (返回给定所有集合的交集)
- SISMEMBER key member (判断 member 元素是否是集合 key 的成员)
- SUNION key1 [key2] (返回所有给定集合的并集)
有序集合(sorted set)
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
- ZADD key score1 member1 [score2 member2] (向有序集合添加一个或多个成员,或者更新已存在成员的分数)
- ZCARD key (获取有序集合的成员数)
- ZCOUNT key min max (计算在有序集合中指定区间分数的成员数)
- ZINCRBY key increment member (有序集合中对指定成员的分数加上增量 increment)
- == ZSCORE key member== (返回有序集中,成员的分数值)
- ZREM key member [member …] (移除有序集合中的一个或多个成员)
- ZRANGE key start stop [WITHSCORES] (通过索引区间返回有序集合指定区间内的成员)
- ZREVRANGE key start stop [WITHSCORES](返回有序集中指定区间内的成员,通过索引,分数从高到低)
主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master,以写为主),后者称为从节点(slave,以读为主),数据的复制是单向的,只能由主节点到从节点。
配置文件
1、因为我只有一个服务器,所以只能单机启动多个redis来测试,分别复制三个redis.conf文件,修改以下内容:
- port (这里将6379为主节点,其他设置不同于6379的端口)
- daemonize yes (让其以守护进程形式开启)
- pid 文件
- log 文件
2、启动服务
redis-server …/redis/redis-6379.conf
redis-server …/redis/redis-6371.conf
redis-server …/redis/redis-6370.conf
redis-cli -p 6379,redis-cli -p 6379,redis-cli -p 6379
启动的三个redis-cli默认都是master主节点
3、配置从节点
主节点为6379端口号,不需要额外配置,配置6370,6371为从节点,用以下命令: - slaveof 127.0.0.1(master主机ip) 6379(master端口号)
- replicaof 127.0.0.1(master主机ip) 6379(master端口号)
二者选择其一就行,这样的命令设置在redis-server关闭就失效了,要想永久配置可以在配置文件中配置:
下面我们设置6370,6371同样
我们再看6379
4、测试
5、故障 - 从机挂了(并不影响主机和其他从机的正常运作)
- 主机挂了(主机挂了因为从机和主机信息是同步的,所以读是没问题的,但是已经不能写了,这样后面的内容添加都无效了)
事务
redis的事务中,一次执行多条命令,本质是一组命令的集合,一个事务中所有的命令都将被序列化,即按顺序执行而不会被其他命令插入
- MULTI (标记一个事务的开启)
- EXEC (执行事务内所有命令)
- DISCARD (放弃事务,事务内所有的命令被取消)
- WATCH (监控一个或者多个key,如果这些key在提交事务之前被其他用户修改过,那么事务将执行失败)
- UWATCH (取消WATCH命令对所有key的监控)
测试一、
测试二、
测试三、
测试四、
事务总结:
- 单独的隔离操作:事务中的所有命令会被序列化,按顺序执行,在执行的过程中不会被其他客户端发送来的命令打断。
- 没有隔离级别的概念:队列中的命令在事务没有被提交之前不会被执行。
- 不保证原子性:redis中一个事务如果存在命令执行失败,那么其他命令依然会被执行,没有回滚机制。
RDB和AOF
redis的数据都保存在内存中,内存中的数据断电即失,但有时候我们想保存redis中的数据,就需要持久化操作,redis提供了两个方案,RDB和AOF,默认开启RDB,AOF是关闭的。
RDB(REDIS DATABASE)
RDB 是 Redis 默认的持久化方案。在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb文件。Redis 重启会通过加载dump.rdb文件恢复数据。
- 配置文件
也可以用下面两个命令保存: - save(阻塞, 只管保存快照,其他的等待)
- bgsave (异步)
测试RDB----
再次启动服务
RDB的优缺点
优点:
- 适合大规模的数据恢复。
- 如果业务对数据完整性和一致性要求不高,RDB是很好的选择。
缺点:
- 数据的完整性和一致性不高,因为RDB可能在最后一次备份时宕机了。
- 备份时占用内存,因为Redis 在备份时会独立创建一个子进程,将数据写入到一个临时文件(此时内存中的数据是原来的两倍),最后再将临时文件替换之前的备份文件。
AOF(APPEND ONLY FILE)
Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
- 配置文件
测试AOF-----
再次启动服务
AOF的优缺点:
优点:
- 数据的完整性和一致性更高。
缺点:
- 因为AOF记录的内容多,文件会越来越大,数据恢复也会越来越慢。