redis的使用

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永不过期
      • 加互斥锁
  • 雪崩
    • 原因:服务器宕机、数据集体过期
    • 解决方法:
      • 集群
      • 服务降级
      • 数据预热、设置不同的过期时间

你可能感兴趣的:(数据库)