Redis

redis

redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。

该数据库使用ANSI C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。

应用场景:

  • 会话缓存(最常用)
  • 消息队列,比如支付
  • 活动排行榜或计数
  • 发布,订阅消息(消息通知)
  • 商品列表,评论列表等

数据类型:

string(字符串),hash(哈希),list(列表),set(集合)和zset(sorted set有序集合)

string:

它是redis的最基本的数据类型,一个键对应一个值,需要注意是一个键值最大存储512MB.

  • set key value [EX seconds] [PX milliseconds] [NX|XX]   设置成功OK,如果针对同一个key设置,会覆盖原来的值
    • EX:(expired过期时间,单位秒),设置成功返回OK。查看过期时间ttl key,  组合命令:set ... ex
    • PX:(过期时间,单位毫秒),设置成功返回OK,查看过期时间pttl
    • NX(not exists):如果指定的Key不存在,就设置该值,  组合命令:sex ... nx
    • XX:如果key存在就设置该值
  • get key获取指定key的值,有值返回值,无值返回nil
  • del key [key...],删除多个key的值,删除成功返回删除的个数,删除失败返回0
  • keys Pattern,查看有什么key
  • dbsize,可以查看key的数量
  • setrange key offset value,从第几位开始替换成我们想要得值,第几位就是offset的值。替换字符串,最后返回整个字符串的长度
  • mset key value [key value ...],设置成功返回OK,重复设置会覆盖
  • mget key [key ...],有值得返回值,无值的返回nil
  • msetnx key value [key value ...],设置成功会返回成功的个数,失败返回0
  • getset key value,支持并发,是原子操作的,先返回该key的原始值,然后用新值替换原来的值
              192.168.127.128:6379>get name
              "zhangsan"

              192.168.127.128:6379>getset name lisi
              "zhangsan"

              192.168.127.128:6379>get name
              "lisi"
  • incr key,该key的值必须是数值类型字符串表示,该函数对key的值加一
  • decr key,该key的值必须是数值型字符串表示,该函数对key的值减一
  • incrby key increment,该key的值必须是数值型字符串表示,该函数对key的值增加指定的数值(正数情况)或者减少指定数值(负数情况)
  • decrby key decrement,该key的值必须是数值型字符串表示,该函数对key的值增加指定的数值(负数情况)或者减少指定数值(正数情况)
  • incrbyfloat key increment,该key的值必须是数值型字符串表示,如果想要给key的值增加或者减少有小数的情况,可以使用该命令,正小数(增加),负小数(减少)
  • append key value,向指定的key追加内容,不会覆盖原始的内容。返回追加后字符串的总长度
  • strlen key,获取指定key值的长度
  • type key,返回当前key的值的类型

hash:

Hash类型是String类型的field和value的映射表,或者说是一个string 集合,它特别适合存储对象.相比较而言,将一个对象类型存储在Hash类型里比存储在string类型占用的内存空间更少,并方便对象的存取。

Hash类型的field字段必须是字符串类型,不能是其他数据类型,换句话说Hash类型不能嵌套其他数据类型

一个Hash类型可以包含的key(其实是field)是2的32次方减去1个,也就是说40多亿个key(这里的key也是指field)都可以被支持,所以说Hash可以存储很大的数据量

  • hset key field value,向键值为key的里面增加field和value的映射数据。增加成功返回1,如果重复增加,会覆盖,但是返回值是0
  • hget key field,根据指定的key和field获取其对应的值。如果有值就返回其值,如果没有返回值为nil
  • hmset key field value [field value ...],可以一次设置多个值。设置成功返回OK。如果重复设置会覆盖原来的值
  • hmget key field [field ...],可以一次性获取指定key的多个field的值,有值的field会返回其值,没有值的返回nil
  • hsetnx key field value,如果指定key的field的值不存在,则增加该值。增加成功返回1,增加失败返回0
  • hincrby key field increment,该value的值必须是数字类型的字符串,否则有错。让指定key的指定field的值增加(正值)或者减少(负值)多少。(ERR hash value is not an integer)
  • hincrbyfloat key field increment,该value的值必须是数字类型的字符串,否则有错。让指定key的指定field的值增加(正值)或者减少(负值)多少小数。(ERR hash value is not an integer)
  • hexists key field,判断指定key的field字段是否有值,有值返回1,无值返回0.
  • hlen key,判断指定key下有几个field。有值返回就是几个,没有纸就返回0
  • hdel key field,删除指定key的field键值对,删除成功返回1,删除失败返回0.
  • hkeys key,列出指定key的field字段值
  • hvals key,列出指定key的field的所对应的值,也就是value
  • hgetall key,列出指定key的field和value的映射值

list:

List类型是一个链表结构的集合,并且是有序的集合,其值是可以重复的,其主要功能操作有push,pop、获取元素等

List类型是一个双端链表结构,我们可以通过相关操作在集合的头部和尾部增加或者删除元素。

List类型设计的非常巧妙,既可以做【栈-先进后出】使用,也可以做【队列-先进先出】使用,能满足绝大多数的需求。List类型有点类似数组的概念,所以具有下标,可以针对指定下标进行操作,比如替换

  • lpush key value [value ...] ,向指定列表key从左面增加元素。增加成功,返回当前列表元素的个数。这个显示的方式是堆栈的形式,先进后出。
  • rpush key value [value ...],向指定的列表key从右面增加元素。增加成功,返回当前列表元素的个数。这个显示的方式是队列的形式,先进先出
  • linsert key BEFORE|AFTER pivot value,向指定列表key在指定元素【前|后】插入元素,成功返回列表当前元素的个数
  • lrange key start stop,将制定列表key的元素按指定范围显示出来。 因为list是双端列表,如果计数是从左到右开始,那就是从0开始,依次是1,2,3等,如果计数是从右到左开始,那就是从-1开始,依次为-2,-3等
  • lset key index(列表下标) value,将指定下标的元素替换掉,替换成功返回OK,可以重复操作,会替换以前的值
  • lrem key count value,删除和指定元素想相等的元素并返回删除的个数,删除正确返回个数,删除错误返回0。count,删除个数,如果count是正数,从列表表头开始搜索,如果count是负数,从列表表尾开始搜索,删除的个数就是count的绝对值
  • ltrim key start(开始值) stop(结束值),保留指定key的索引值范围内的数据,其他数据删除,开始从0开始。修剪成功返回OK,可以重复执行
  • lpop key,从list的头部删除元素,并返回删除元素
  • rpop key,从list的尾部删除元素,并返回删除元素
  • rpoplpush source destination,第一步从指定list列表的尾部删除元素,第二步,从指定list列表头部加入元素
  • lindex key index,返回指定list列表中index为止的元素
  • llen key,返回指定key列表的元素的个数

set:

set集合是string类型的无需集合,集合里面的元素不能重复,或者说必须是唯一的

set内部是通过Hashtable来实现的,并且这个Hashtable的value是没有值的,既然是集合,因此,我们可以对集合实施交集(Inter--InterStore)、并集(Union--UnionStore)和差集(Diff--DiffStore)的操作。操作复杂度都是:O(1)

  • sadd key member [member ...],可以向名称为key的set集合中添加元素,一次可以添加多个,也可以添加一个,以空格为分隔符,并且增加的元素不能有重复。成功返回添加的元素的个数
  • smembers key,我们可以通过该方法查看名称为key集合的元素
  • srem key member [member ...],删除set集合元素,可以删除一个,也可以删除多个。成功删除返回删除个数,失败返回0
  • spop key [count],随机返回删除的key,可以返回【count】个,返回的元素会被删除
  • sinter key [key ...],取两个或者多个集合的交集
  • sinterstore destination key [key ...],取两个或者多个集合的交集并存到指定集合里
  • sunion key [key ...],取两个或者多个集合的并集。如果有重复元素,会去掉重复元素然后在显示
  • sunionstore destination key [key ...],取两个或者多个集合的并集并存储到指定集合里
  • sdiff key [key ...],取两个或者多个集合不同的元素,第一个参数集合为参考对象,由于参考对象不同,结果可能也不同
  • sdiffstore destination key [key ...],取两个或者多个集合不同的元素,并把结果存储到指定集合里
  • smove source destination member,把一个元素member从一个set集合移动到另一个set集合
  • scard key,查看集合里元素的个数
  • sismember key member,判断某个元素是否在指定的集合里面,存在返回1,不存在返回0
  • srandmember key [count],随机返回一个或者几个元素,不会删除元素,默认返回一个元素。每次执行都会返回不同的结果

zset:

ZSet数据类型,是有序的集合类型,集合里面的元素必须保证唯一,不会出现重复的元素。

无论以什么方式访问有序集合都很快,因为它内部是通过哈希表和跳跃表来实现的。默认排序是由小到大

  • zadd key [NX|XX] [CH] [INCR] score member [score member ...],向有序集合中添加一个h或者多个元素,该元素如果存在,则更新顺序。如果在重复插入的时候,会根据顺序属性更新
         192.168.127.128:6379>zadd set1 7 aaa 5 bbb 10 ccc
               (integer)3

               如果想要修改某元素的分数,例如把aaa的分数改成10,可以如下:
               zadd set1 10 aaa

               当前返回值为0,但是分数已经成功修改。默认返回值是增加到有序集合里面元素的个数。

              nx参数:如果该元素不存在则增加该元素
              xx参数:如果该元素存在则修改该元素
              ch参数:可以让方法返回值是更改分数的元素的个数
              incr参数:可以对指定元素的分数进行增加或者减少指定数值,正数增加,负数减少

              zadd set1 [nx|xx|ch|incr] 10 aaa
  • zrange key start stop [WITHSCORES],查看有序集合的元素,分数可以是选项,可以显示,也可以不显示
  • zrevrange key start stop [WITHSCORES],按分数从大到小的排序集合元素,默认是小到大排序。
  • zrem key member [member ...],删除名称为key的zset中的元素member,可以删除一个,也可以删除多个。成功返回删除个数,失败返回0。
  • zincrby key increment member,以指定值去自动递增或者递减少指定元素的分数,用法和之前的incryby类似
  • zrangebyscore key min max [WITHSCORES],查找分数在指定区间范围的元素,返回找到的个数。
  • zremrangebyrank key start stop,根据索引值删除指定的元素,返回删除的个数,没有数据返回0.
  • zremrangebyscore key min max根据指定的分数删除元素,返回删除的个数,没有数据返回0
  • zrank key member,(从小到大)返回排序索引从小到大排序的某有序集合里面某元素的索引,无值返回nil,索引从0开始计数
  • zrevrank key member,返回排序索引从大到小排序的索引值,也就是说最大的分数的索引是0(降序排序之后再找索引)
  • zcard key,返回集合里所有元素的个数。
  • zcount key min max,返回集合中score在给定区间中的数量

 


 

redis的服务相关的命令

select#选择数据库(数据库编号0-15)
退出#退出连接
信息#获得服务的信息与统计
monitor#实时监控
config get#获得服务配置
flushdb#删除当前选择的数据库中的key
flushall#删除所有数据库中的键

 

redis的发布与订阅

redis的发布与订阅(发布/订阅)是它的一种消息通信模式,一方发送信息,一方接收信息。

三个客户端同时订阅同一个频道:

有新信息发送给频道1时,就会将消息发送给订阅它的三个客户端:

 

redis的持久化

redis持久有两种方式:快照(快照),仅附加文件(AOF)

快照(快照):  

1,将存储在内存的数据以快照的方式写入二进制文件中,如默认dump.rdb中
2,保存900 1 

#900秒内如果超过1个Key被修改,则启动快照保存
3,保存300 10 

#300秒内如果超过10个Key被修改,则启动快照保存
4,保存60 10000 

#60秒内如果超过10000个重点被修改,则启动快照保存

 

仅附加文件(AOF):

1,使用AOF持久时,服务会将每个收到的写命令通过写函数追加到文件中(appendonly.aof)
2,AOF持久化存储方式参数说明
    appendonly yes  

           #开启AOF持久化存储方式 
    appendfsync always 

         #收到写命令后就立即写入磁盘,效率最差,效果最好
    appendfsync everysec

         #每秒写入磁盘一次,效率与效果居中
    appendfsync no 

         #完全依赖操作系统,效率最佳,效果没法保证

 

redis的性能测试

自带相关测试工具

实际测试同时执行100万的请求:

 

posted @ 2019-08-16 11:49  JamJarBranch  阅读(135)  评论(0编辑  收藏  举报