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
  • 键(key)的操作
命令用法
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 keykey自增1(相当于++)
decr keykey自减1(相当于–)
incrby key numberkey自增number(相当于+=number)
decrby key numberkey自减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 v3mset可以一次添加多条数据(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 list02list01右边出一个,从左进入到 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 set02set01和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 grade2grade3在集合中的下标(从上向下)
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:悲观锁和乐观锁