redis数据库
一、redis是什么?
- nosql数据库
- Redis键值对数据库
- MongoDB文档数据库
- 列存储数据库HBASE
- 图关系数据库neo4j、infogrid
- 键值对数据库
- 数据存储在内存中
- 用C语言编写的
- 键值是字符串类型
二、数据类型
(数据类型值指得是key所对应的value类型**)
1、字符串类型
2、list
3、set
4、hash(key value(key value) 主要用来存储对象)
5、zset
- string类型的有序不可重复集合
- sorted set 中的每一个元素都有一个分数,按分数的大小,升序排序。如果分数相同,则以字典的顺序升序排序
6、geospatial:地理位置
7、hyperloglog:基于基数的操作
8、bitmap:位数操作
三、常用的操作
1、key操作
- keys * :查看数据库中所有的key
- exists key …:判断key是否存在,存在几个就返回几
- move key 数据库的索引下标:将key移动到指定的库中
- expire key 秒:设定指定的key的存活时间
- ttl key :查看的key的剩余存活时间(-2表示已经过期,-1表示永不过期)
- type key :查看当前key的类型
- select 下标:切换数据库
- redis默认有16个k库,可以通过修改配置文件来修改库的数量
2、string操作
- set key value:存贮一个普通的字符串数据(key相同,后面的则会覆盖前面的)
- get key :获取key对应的value值
- del key:删除指定的key
- append key value:在原有的key对应的value值后面追加,如果没有key则创建
- strlen key: 获取key对应的value的长度
- incr key:给key对应的value值加一(value的值必须是数字字符串)
- decr key : 给key对应的value值减一(value的值必须是数字字串)
- incrby key n : key对应的value值加n
- decrby key n :key对应的value值减n
- setrange key n value: 从n的位置开始替换原有的value值
- getrange key n m :从n的位置开始获取value到m(n,m指的元素的位置,从1开始)
- setex key n value:设置一组带存活时间的值
- setnx key value:设置一组值永久存活
- mset key1 value1 key2 value2:一次设置多组值(键相同会发生覆盖)
- mget key1 key2:一次获取多个
- msetnx key1 value1 key2 value2:一次设置多个永久存活的值
3、list操作
- lpush 集合的名字 值:从左边开始向集合中添加值
- rpush 集合的名字 值:从右边开始向集合中添加值
- lrange 集合的名字 0 -1:查看list集合中的所有的元素
- llen 集合的名字:查看list集合的长度
- lpop 集合的名称:从左边开始移除集合中的一个元素
- rpop 集合的名称 :从右边开始移除集合中的一个元素
- lindex 集合的名称 索引值 :获取集合中指定下标的值
- lrem 集合的名称 数量 值:删除集合中指定数量的值
4、set集合的操作
-
sadd 集合的名称 值:向set集合中添加值
-
smembers 集合的名称:查看集合中所有的元素
-
scard 集合的名称 :查看set集合中元素的个数
-
srem 值: 删除set集合中的指定值
-
spop 集合的名称:随机的从set集合中删除一个数据
-
smove 集合一 集合二 值:将set集合一中的指定值移动到set集合二中
-
sdiff:差集
-
sinter:交集
-
sunion:并集
5、hash的操作
- hset key value的名称 value的值 :存贮一组属性值
- hget key value的名称:获取key对应的value对应的值
- hmset key value的名称 value的值 value的名称 value的值:此次设定多个value的键值对
- hmget key value的名字 value的名字 :获取多个value的值
- hgetall key:获取key的所有属性
- hdel key value名:删除Key 对应的value的值
- hlen key :查看key有几组键值对
- hexists key value名称:查看是否存在指定的value值
- hkeys :获取所有的key
- hvals:获取所有的值
- hincrby key value名称 n:增加指定n给value
- hsetnx:设置永久存贮的key
6、zset的操作
- zadd 集合名称 分数 value:添加元素
- zrange 集合名 0 -1:查询所有的元素
- zrangescore:根据分数查询内容
- zrem 集合名称 value值 :删除指定元素
- zcard 集合名称 :统计集合中的元素个数
- zcount 集合名称 分数1 分数2 :统计分数区间内的元素个数
- zscore 集合名称 :获取元素对应的分数
四、Redis的事务
- Redis的事务不具备原子性,单挑命令保持原子性
- 没有隔离级别的概念
- 开启事务multi
- 执行事务exec
- 取消事务discard
五、Redis中的watch
- 监视一个数据
- 相当于乐观锁的概念
- 当数据发生变化之后,进行的修改操作就会失败
- 释放监视unwatch
- 修改失败之后解除监视,然后重新监视,就会获得新的数据再次操作
六、Redis可能遇到的问题与解决方案
1、持久化的操作
- rdb
- 主进程开出一个子进程,将内存内容写入dunp.red文件,主进程主进程继续处理客户端的请求
- 如果临时文件生成永久文件的时候出意外,数据会丢失
- 保存的速度快
- 达到设置的持久化条件时就会触发
- Redis默认使用的机制
- 正常退出Redis也会触发rdb机制
- Redis启动的时候会自动加载启动目录下的rdb文件到数据库中
- aof
- 就是把所有的命令都保存下来(不保存读的,命令)
- 只许追加文件,所以产生大量的文件,占内存
- 当aof文件出错时,Redis将不能正常启动
- 使用Redis自带的修复工具可以修复aof文件
- aof有三种触发机制
- 每次修改都吃法
- 每一秒触发一次
- 操作系统自己触发
2、发布订阅
- subscribe:订阅chanle
- publish:发送消息
3、主从复制
- 主机写从机读
- 单台Redis的内存不要超过20G
- 主机中的所有东西都会被从机保存
- 使用全量复制和增量复制来同步数据
4、哨兵模式
- 哨兵是一个独立的进程,通过过向每一个Redis发送请求,根据响应的结果来进行监控
- sentinel,哨兵也使用集群的方式,保证哨兵的工作
5、Redis的缓存穿透、击穿和雪崩
- 穿透:
- 原因:缓存中没有访问的数据,mysql中也没有
- 解决方法
- 布隆过滤器
- 对所有可能查询的参数以哈希的形式存储,在控制层先进性校验,不符合就丢弃
- 存储空的对象
- 会导致性能方面的问题
- 布隆过滤器
- 击穿:
- 原因:集中在一点的大量请求,但是缓存中的这个key过期了,就会导致这大量的请求到MySQL
- 解决方法:
- 设置key永不过期
- 加互斥锁
- 雪崩
- 原因:服务器宕机、数据集体过期
- 解决方法:
- 集群
- 服务降级
- 数据预热、设置不同的过期时间