• Redis命令、数据结构场景、配置文件总结


    本文大纲

    一、常用数据类型简介
    二、redis操作命令
    三、redis配置文件详解
    四、redis数据类型使用场景

    一、常用数据类型简介  

    redis常用五种数据类型:string,hash,list,set,zset(sorted set).
    1.String类型

    String是最简单的类型,一个key对应一个value
    String类型的数据最大1G。
    String类型的值可以被视作integer,从而可以让“INCR”命令族操作(incrby、decr、decrby),这种情况下,
    该integer的值限制在64位有符号数。
    在list、set和zset中包含的独立的元素类型都是Redis String类型。

    2.List类型

    链表类型,主要功能是push、pop、获取一个范围的所有值等。其中的key可以理解为链表的名字。
    在Redis中,list就是Redis String的列表,按照插入顺序排序。比如使用LPUSH命令在list头插入一个元素,
    使用RPUSH命令在list的尾插入一个元素。当这两个命令之一作用于一个空的key时,一个新的list就创建出来了。
    List的最大长度是2^32-1个元素。

    3.Set类型

    集合,和数学中的集合概念相似。操作中的key理解为集合的名字。
    在Redis中,set就是Redis String的无序集合,不允许有重复元素。
    Set的最大元素数是2^32-1。Redis中对set的操作还有交集、并集、差集等。

    4.ZSet(Sorted Set)类型

       Zset是set的一个升级版本,在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次

    指定后zset会自动安装指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。
    Zset的最大元素数是2^32-1。
    对于已经有序的zset,仍然可以使用SORT命令,通过指定ASC|DESC参数对其进行排序。

    5.hash类型

      hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。

    二、redis操作命令

    1.对value操作的命令

    exists(key):确认一个key是否存在
    del(key):删除一个key
    type(key):返回值的类型
    keys(pattern):返回满足给定pattern的所有key
    randomkey:随机返回key空间的一个key
    rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
    dbsize:返回当前数据库中key的数目
    expire:设定一个key的活动时间(s)depire后del会删除该key,时间消失
    expire后接set命令会移除过期时间
    ttl:获得一个key的活动时间
    select(index):按索引查询
    move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
    flushdb:删除当前选择数据库中的所有key
    flushall:删除所有数据库中的所有key

    2.对String操作的命令

    set(key, value):给数据库中名称为key的string赋予值value
    get(key):返回数据库中名称为key的string的value
    getset(key, value):给名称为key的string赋予上一次的value
    mget(key1, key2,…, key N):返回库中多个string(它们的名称为key1,key2…)的value
    setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
    setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
    mset(key1, value1, key2, value2,…key N, value N):同时给多个string赋值,名称为key i的string赋值value i
    msetnx(key1, value1, key2, value2,…key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,
    名称 key i赋值为value i
    incr(key):名称为key的string增1操作
    incrby(key, integer):名称为key的string增加integer
    decr(key):名称为key的string减1操作
    decrby(key, integer):名称为key的string减少integer
    append(key, value):名称为key的string的值附加value
    substr(key, start, end):返回名称为key的string的value的子串

    3.对List操作的命令

      Redis的list类型其实就是一个每个子元素都是string类型的双向链表,链表的最大长度是2^32。list既可以用做栈,也可以用做队列。

      list的pop操作还有阻塞版本,主要是为了避免轮询。

    rpush(key, value):在名称为key的list尾添加一个值为value的元素
    lpush(key, value):在名称为key的list头添加一个值为value的 元素
    llen(key):返回名称为key的list的长度
    lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)
    ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素
    lindex(key, index):返回名称为key的list中index位置的元素
    lset(key, index, value):给名称为key的list中index位置的元素赋值为value
    lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count>0
    从头至尾删除count个值为value的元素,count<0从尾到头删除|count|个值为value的元素。
    lpop(key):返回并删除名称为key的list中的首元素
    rpop(key):返回并删除名称为key的list中的尾元素
    blpop(key1, key2,… key N, timeout):lpop 命令的block版本。即当timeout为0时,若遇到名称为key i的list不
    存在或该list为空,则命令结束。如果 timeout>0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对key i+1开
    始的list执行pop操作。
    brpop(key1, key2,… key N, timeout):rpop的block版本。参考上一命令。
    rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

    4.对Set操作的命令-无序集合

    sadd(key, member):向名称为key的set中添加元素member
    srem(key, member) :删除名称为key的set中的元素member
    spop(key) :随机返回并删除名称为key的set中一个元素
    smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合
    scard(key) :返回名称为key的set的基数
    sismember(key, member) :测试member是否是名称为key的set的元素
    sinter(key1, key2,…key N) :求交集
    sinterstore(dstkey, key1, key2,…key N) :求交集并将交集保存到dstkey的集合
    sunion(key1, key2,…key N) :求并集
    sunionstore(dstkey, key1, key2,…key N) :求并集并将并集保存到dstkey的集合
    sdiff(key1, key2,…key N) :求差集
    sdiffstore(dstkey, key1, key2,…key N) :求差集并将差集保存到dstkey的集合
    smembers(key) :返回名称为key的set的所有元素
    srandmember(key) :随机返回名称为key的set的一个元素

    5.对zset(sorted set)操作的命令-有序集合

    zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则
    根据score更新该元素的顺序。
    zrem(key, member) :删除名称为key的zset中的元素member
    zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则
    向集合中添加该元素,其score的值为increment
    zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有
    member元素,返回“nil”
    zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若
    没有member元素,返回“nil”
    zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
    zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素
    zrangebyscore(key, min, max):返回名称为key的zset中score >= min且score <= max的所有元素
    zcard(key):返回名称为key的zset的基数
    zscore(key, element):返回名称为key的zset中元素element的score
    zremrangebyrank(key, min, max):删除名称为key的zset中rank >= min且rank <= max的所有元素
    zremrangebyscore(key, min, max) :删除名称为key的zset中score >= min且score <= max的所有元素
    zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX):对N个zset求
    并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT
    参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行 SUM运算的
    值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。

    6.对Hash操作的命令

      Redis hash是一个string类型的field和value的映射表,它的添加、删除操作都是O(1)(平均)。hash特别适用于存储对
      象,将一个对象存储在hash类型中会占用更少的内存,并且可以方便的存取整个对象。

    hset(key, field, value):向名称为key的hash中添加元素field<—>value
    hget(key, field):返回名称为key的hash中field对应的value
    hmget(key, field1, …,field N):返回名称为key的hash中field i对应的value
    hmset(key, field1, value1,…,field N, value N):向名称为key的hash中添加元素field i<—>value i
    hincrby(key, field, integer):将名称为key的hash中field的value增加integer
    hexists(key, field):名称为key的hash中是否存在键为field的域
    hdel(key, field):删除名称为key的hash中键为field的域
    hlen(key):返回名称为key的hash中元素个数
    hkeys(key):返回名称为key的hash中所有键
    hvals(key):返回名称为key的hash中所有键对应的value
    hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

    7、服务器相关命令
      (1)ping:测定连接是否存活
      (2)echo:在命令行打印一些内容
      (3)select:选择数据库
      (4)quit:退出连接
      (5)dbsize:返回当前数据库中key的数目
      (6)info:获取服务器的信息和统计
      (7)monitor:实时转储收到的请求
      (8)config get 配置项:获取服务器配置的信息
         config set 配置项 值:设置配置项信息
      (9)flushdb:删除当前选择数据库中所有的key
      (10)flushall:删除所有数据库中的所有的key
      (11)time:显示服务器时间,时间戳(秒),微秒数
      (12)bgrewriteaof:后台保存rdb快照
      (13)bgsave:后台保存rdb快照
      (14)save:保存rdb快照
      (15)lastsave:上次保存时间
      (16)shutdown [save/nosave]
          注意:如果不小心运行了flushall,立即shutdown nosave,关闭服务器,然后手工编辑aof文件,去掉文件中的flushall相关行,然后开启服

          务器,就可以倒回原来是数据。如果flushall之后,系统恰好bgwriteaof了,那么aof就清空了,数据丢失。
      (17)showlog:显示慢查询
          问:多慢才叫慢?
          答:由slowlog-log-slower-than 10000,来指定(单位为微秒)
          问:服务器存储多少条慢查询记录
          答:由slowlog-max-len 128,来做限制 

    三、redis配置文件详解

    redis.conf 配置项说明如下:
    1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
      daemonize no
    2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
      pidfile /var/run/redis.pid
    3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对
      应的号码,而MERZ取自意大利歌女Alessia Merz的名字
      port 6379
    4. 绑定的主机地址
      bind 127.0.0.1
    5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
      timeout 300
    6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
      loglevel verbose
    7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
      logfile stdout
    8. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
      databases 16
    9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
      save <seconds> <changes>
      Redis默认配置文件中提供了三个条件:
      save 900 1
      save 300 10
      save 60 10000
      分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

    10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
      rdbcompression yes
    11. 指定本地数据库文件名,默认值为dump.rdb
      dbfilename dump.rdb
    12. 指定本地数据库存放目录
      dir ./
    13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
      slaveof <masterip> <masterport>
    14. 当master服务设置了密码保护时,slav服务连接master的密码
      masterauth <master-password>
    15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
      requirepass foobared
    16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置
      maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错
      误信息
      maxclients 128
    17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法
      处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在
      swap区,maxmemory <bytes>
    18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据
      丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
      appendonly no
    19. 指定更新日志文件名,默认为appendonly.aof
      appendfilename appendonly.aof
    20. 指定更新日志条件,共有3个可选值:
      no:表示等操作系统进行数据缓存同步到磁盘(快)
      always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
      everysec:表示每秒同步一次(折衷,默认值)
      appendfsync everysec
    21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多
      的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
      vm-enabled no
    22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
      vm-swap-file /tmp/redis.swap
    23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是
      说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
      vm-max-memory 0
    24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大
      小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就

      使用默认值
      vm-page-size 32
    25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
      vm-pages 134217728
    26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
      vm-max-threads 4
    27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
      glueoutputbuf yes
    28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
      hash-max-zipmap-entries 64
      hash-max-zipmap-value 512
    29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)
      activerehashing yes
    30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
      include /path/to/local.conf
    31. aof-rewrite-incremental-fsync:是否采取增量文件同步策略,默认为“yes”。 rewrite过程中,每32M数据进行一次文件同步
    32. client-output-buffer-limit slave 256mb 64mb 60
      这里对是客服端是slave的做限制
      256mb 是一个硬性限制,当output-buffer的大小大于256mb之后就会断开连接
      64mb 60 是一个软限制,当output-buffer的大小大于64mb并且超过了60秒的时候就会断开连接
    33. activerehashing yes:是否激活重置hash算法,默认yes
    34. hash-max-zipmap-entries是指hashtable中元素的总个数不超过设定数量时,就用zipmap的方式来存储hashtable以节省内存
    35. hash-max-zipmap-value是hashtable中的key以及value的长度小于设定的值时,就用zipmap的方式来存储hashtable以节省内存
      一旦hashtable的元素个数超过了设定的值,或者任意一个元素的key或者value超过了hash-max-zipmap-value的值,则使用
      hashtable来存储
    36. unixsocketperm 700 : unixsocketperm的权限由755修改为700;
    37. aof-load-truncated yes : redis在启动的时候可以加载被截断的AOF文件,默认启用;
    38. cluster-require-full-coverage yes : rc1之前,如果至少有一个slot没有被节点覆盖,则整个集群不可用;现在,启用该配置
      即使有部分slot没有被覆盖,被覆盖到的那部分slot构成的子集群仍然可用
    39. no-appendfsync-on-rewrite no:不丢失数据,但要忍受阻塞的后果
      no-appendfsync-on-rewrite yes:相当于appendfsync设置为no

    四、redis数据类型使用场景

    1.String类型的应用场景
      String是最常用的一种数据类型,普通的key/value存储.

    2.list类型的应用场景
      比较适用于列表式存储且顺序相对比较固定或者应用于消息队列,例如:省份、城市列表、品牌、厂商、车系、车型等列表

    3.set类型的应用场景
      Set对外提供的功能与list类似,当需要存储一个列表数据,又不希望出现重复数据时,可选用set

    4.zset(sorted set)类型的应用场景
      zset的使用场景与set类似,区别是set不是自动有序的,而zset可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且
      是插入有序的,即自动排序.当你需要一个有序的并且不重复的集合列表,那么可以选择zset数据结构。例如:
      根据PV排序的热门车系车型列表
      根据时间排序的新闻列表

    5.hash类型的应用场景
      类似于表记录的存储、页面视图所需数据的存储

  • 相关阅读:
    唐骏:学会高明的让员工加班
    [ZT]微软亚洲技术中心面试题[附非標准答案]
    企业的后ERP时代
    WinForm中使用DXperience控件中XtraForm,如何实现换肤
    世卫组织健康食品排行榜:健康肉类减为三种
    [轉載]在研究院的新兵训练
    [转]怎样面对同事升职?
    今天是个好日子!
    程序员跳槽动机被误读,薪资只是表象(图文)
    2008年个人技术十大趋势
  • 原文地址:https://www.cnblogs.com/jiangds/p/6710157.html
Copyright © 2020-2023  润新知