Redis
Posted 技术很low的瓜贼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis相关的知识,希望对你有一定的参考价值。
文章目录
Redis简介
- Redis是一种运行速度很快,并发性能很强,并且运行在内存上的NoSQL数据库
NoSQL和传统数据库的相比
- NoSQL数据库无需事先为存储的数据建立字段,随时可以存储自定义的数据格式
- 相对于传统的关系型数据库,简化了对与字段的操作
- Redis的常用使用场景
- 缓存:缓存在提升服务器性能方面非常有效,相对于传统的关系型数据库,Redis可以很高效的访问
- 排行榜:Redis的SortSet(有序集合)数据结构能够简单的搞定排行榜功能
- 计算器/限速器:利用Redis中原子性的自增操作,可以统计点赞数访问数等(传统数据库中频繁的读写会给数据库带来相当大的压力);限速器常用于限制某个用户访问某个API的频率(如抢购时,防止用户疯狂点击带来不必要的压力)
- 友好关系:利用交集,并集,差集等搞定共同好友,共同爱好等功能
- 简单消息队列:使用发布订阅模式实现队列机制(如:到货通知),也可以使用List实现队列机制,完成异步解耦
- Session共享:,默认Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在那台机器上都能够获取到对应的Session信息
Redis/Memcache/MongoDB对比
- 相同点:都是NoSQL数据库
- Redis和Memcache对比
- Memcache可以用来缓存其他东西,如图片视频等
- Memcache数据结构单一,只有Key——Value结构,而Redis还有List,set,hash等数据结构
- Redis当物理内存用完时,可以将一些长时间没有用到的value交换到磁盘
- Memcache没有持久化机制(挂掉以后,数据就没了),Redis有持久化机制,其中的数据可以定期保存到内存中
- Memcache挂掉后,数据不可恢复;Redis数据丢失后,可以通过RDB和AOF(RDB和AOF是Redis数据库的两种持久化操作)恢复
- Redis和MongoDB对比
- Redis和MongoDB是一种写作共存关系
- MongoDB本质上还是硬盘数据库,在复杂查询时会有大量的资源消耗,而在处理复杂逻辑时候仍然要进行多次查询(此时就需要使用Redis和Memcahe这样的内存数据库作为中间层进行缓存和加速)
- 在某些复杂页面的场景中,整个页面的内容如果都从mongodb中查询,可能要几十个查询语句,耗时很长(此时两者可以协作:可以把整个页面的对象缓存至redis中,定期更新)
分布式数据库CAP原理
- 传统关系型数据库具备ACID(A:原子性,C:一致性,I:独立性,D:持久性)
- 分布式数据库具备CAP
- C:强一致性(所有节点在同一时间的数据完全一致)
- A:高可用性(服务一直可用,不出现超时等体验不好的情况)
- P:分区容错性(在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或者可用性的服务)
- 分区是常态,CAP三者不可共存
- 一致性高可用性低(相反,一致性低可用性高)
- 根据 CAP 原理将 NoSQL 数据库分成了满足 CA (可扩展性不强)原则、满足 CP(通用性不高) 原则和满足 AP(对一致性要求较低) 原则三 大类
Redis启动操作
cd /usr/local/bin
redis-server /opt/redis-5.0.4/redis.conf
- 关闭数据库
- 单实例关闭
redis-cli shutdown
- 多实例关闭
redis-cli -p 6379 shutdown
- 检测6379端口是否在监听
netstat -lntp | grep 6379
- 检测后台进程是否存在
ps -ef|grep redis
- 查询数据库键的数量
dbsize
- 清空数据库
- 清空当前库
flushdb
- 清空所有库
flushall
- 模糊查询
*:通配任意多个字符
命令 | 用法 |
---|
keys * | 查询所有键 |
keys k* | 模糊查询k开头,后面随便多少个字符 |
keys *e | 模糊查询e为最后一位,前面随便多少个字符 |
keys *k* | 双 * 模式,匹配任意多个字符:查询包含k的键 |
?:通配单个字符
命令 | 用法 |
---|
keys k? | 模糊查询k字头,并且匹配一个字符 |
keys k?? | 第一个字母是k,他的长度是3 |
?:通配单个字符
命令 | 用法 |
---|
keys r[ae]dis | 记得其他字母,就第二个字母可能是a或e |
命令 | 用法 |
---|
exists key | 判断某个key是否存在 |
move key db | 移动(剪切,粘贴)键到几号库 |
ttl key | 查看键还有多久过期(-1永不过期,-2已过期) |
expire key | 为键设置过期时间(生命倒计时)默认单位为秒 |
type key | 查看键的数据类型 |
Redis五大数据类型(命令)
一、字符串String
命令 | 用法 |
---|
set key value | 保存数据 |
get key | 获取数据key |
del key | 删除数据key |
append key abc | 往key的值后追加数据abc |
strlen key | 返回key值的长度 |
命令 | 操作(操作的必须为数字类型,key的值为数字) |
---|
incr key | key自增1(相当于++) |
decr key | key自减1(相当于–) |
incrby key number | key自增number(相当于+=number) |
decrby key number | key自减number(相当于-=number) |
命令 | 用法 |
---|
getrange key 0 -1 | 查询key全部的值(此代码中0和-1为固定的) |
getrange key 0 3 | 查询key的值,范围是下标0~下标3(下标值为变量) |
setrange key 1 xxx | 替换key的值,从下标1开始替换为xxx(下标值为变量) |
命令 | 用法 |
---|
setex key 10 value | 添加key value数据的同时,设置10秒的声明周期 |
setnx key value | 添加数据的时候判断是否已经存在,防止已存在的数据被覆盖掉 |
命令 | 用法 |
---|
mset k1 v1 k2 v2 k3 v3 | mset可以一次添加多条数据(set 不可以) |
mget k2 k3 | 一次获取多条数据(get不可以) |
msetnx k3 v3 k4 v4 | 一次性添加多条数据,同时判断是否已经存在 |
getset key value | 先获取key的值,然后再修改key的值为value(如果获取为null,将key value添加到数据库中) |
二、列表List
命令 | 用法 |
---|
lpush list 1 2 3 4 5 | 从上往下添加(从左向右添加) |
rpush list 1 2 3 4 5 | 从下往上添加(从右向左添加) |
lrange list 0 -1 | 查询list中的全部数据0表示开 始,-1表示结尾 |
命令 | 用法 |
---|
lpop list | 从左(上)边移除第一个元素 |
rpop list | 从右(下)边移除第一个元素 |
命令 | 用法 |
---|
llen list | 返回集合长度 |
lrem list m n | 从list中移除m个n |
ltrim list m n | 截取下标m~n的值,别的全去除掉 |
rpoplpush list01 list02 | list01右边出一个,从左进入到 list02的第一个位置 |
lset list m x | 将list中下标为m的元素修改成x |
linsert list before 2 xxx | 从左边进入,在list中的 2元素之前插入xxx |
linsert list after 2 xxx | 从左边进入,在list中的 2元素之后插入xxx |
三、集合Set
命令 | 作用 |
---|
sadd set 1 2 2 3 3 3 | 在set集合中添加元素(自动排除重复元素) |
smembers set | 查看set集合中的元素 |
sismember set m | 查询set集合中是否存在m,存在返回1,不存在返回0 |
scard set | 获取set集合中的元素个数 |
srem set m | 移除set集合中的元素m |
srandmember set m | 从集合set中随机获取m个元素 |
spop set | 从集合set中随机移除一个元素 |
smove set01 set02 x | 将set01中的元素x移动到set02中 |
命令 | 作用 |
---|
sinter set01 set02 | set01和set02共同存在的元素(取交集) |
sunion set01 set02 | 将set01和set02中所有元素合并起来(取并集) |
sdiff set01 set02 | 在set01中存在,在set02中不存在(取差集) |
四、哈希Hash
命令 | 作用 |
---|
hset user name gyt | 添加user,值为name=gyt |
hget user name | 查询user,必须指明所要查询具体的字段 |
hmset student id 101 name tom age 22 | 添加学生student,属 性多类 |
hmget student name age | 查询student,获取多类属性的值 |
hgetall student | 查询student,获取全部属性的值 |
hdel student age | 删除student中age属性 |
命令 | 作用 |
---|
hlen student | 返回student中属性的数量 |
hexists student name | 判断student中是否存在name属性 |
hkeys student | 获取student所有的属性名 |
hvals student | 获取student所有属性的值(内容) |
hsetnx student age 18 | 添加的时候,先判断是否存在 |
命令 | 作用 |
---|
hincrby student age 2 | 将age属性的值自增2(age类型的值需为整数类型) |
hincrbyfloat user money 5.5 | 将money属性的值自增5.5 |
五、有序集合Zset
命令 | 作用 |
---|
zadd zset 10 grade1 20 grade2 30 grade3 | 按照一对一的形式添加数据 |
zrange zset 0 -1 | 查询数据 |
zrange zset 0 -1 withscores | 带着分数查询数据 |
命令 | 作用(模糊查询) |
---|
zrangebyscore zset 10 20 | 查询分数在10 <= score <= 20之间的数据 |
zrangebyscore zset 20 (30 | 查询分数在20 <= score < 30 ( : 不包含 |
zrangebyscore zset 10 30 limit 2 1 | 共返回三个,跳过前2个,取1个limit:跳过几个截取几个 |
命令 | 作用 |
---|
zrem zset grade2 | 移除grade2 |
zcard zset | 集合中元素的个数 |
zcount zset 20 30 | 分数在20~30之间,共有几个元素 |
zrank zset grade2 | grade3在集合中的下标(从上向下) |
zscore zset grade1 | 通过值获取分数 |
命令 | 作用(逆序) |
---|
zrevrank zset grade2 | 逆序找下标(从下向上) |
zrange zset 0 -1 | 顺序查询 |
zrevrange zset 0 -1 | 逆序查询 |
zrevrangebyscore zset 30 20 | 逆序查询分数在30~20之间的 (注意,先写大值,再写小值) |
持久化
一、RDB(Redis DataBase)
- 在指定时间间隔内,将内存中的数据集的快照写入磁盘 (备份)
- 默认保存在/usr/local/bin中,文件名dump.rdb
RDB的备份方式分为自动备份(修改配置)与手动备份(操作完执行save命令)
二、AOF(Append Only File)
- 以日志的形式记录每个写操作
- 将redis执行过的写指令全部记录下来(读操作不记录)
- 只许追加文件,不可以改写文件
- redis在启动之初会读取该文件从头到尾执行一遍,这样来重新构建数据
AOF比RDB数据保存的完整性更高,当RDB和AOF两种备份策略同时开启,优先使用AOF
事务
- 可以一次执行多个命令,是一个命令组,一个事务中,所有命令都会序列化(排队),不会被插队
- 一个队列中,一次性,顺序性,排他性的执行一系列命令
事务的三个特性
- 隔离性:所有命令都会按照顺序执行,事务在执行的过程中,不会被其他客户端送来的命令打断
- 没有隔离级别:队列中的命令没有提交之前都不会被实际的执行,不存在事务中查询可以看到事务里的更新,事务外查询不能看到
- 不保证原子性:如果一个命令失败,但是别的命令可能会执行成功,没有回滚
- 开启事务的三步:开启:
multi
入队:queued
执行:exec
以上是关于Redis的主要内容,如果未能解决你的问题,请参考以下文章
redis介绍及搭建
redis补充6之Redis 设置过期时间
程序员谈话系列——关于redis的一些理解
Redis实战之使用Lua脚本保证原子性
乐观悲观锁redis分布式锁
大数据之Redis:悲观锁和乐观锁