• 技术文章 >数据库 >Redis

    总结Redis常用数据类型操作指令

    coldplay.xixicoldplay.xixi2021-02-19 09:45:08转载206

    推荐(免费):redis教程

    Redis 命令用于在 redis 服务上执行操作。要在 redis 服务上执行命令需要一个 redis
    客户端。可以使用redis-cli命令启动Redis客户端。完整的启动命令是redis-cli -h host -p port -a password

    Redis常用的数据类型有五种:stringhashlistsetzset(sorted set有序集合)。学习这些类型之前还需要学习常用命令Key的管理。下面详细介绍这些类型:更详细的API可以参照此处

    常用命令Key管理

    Key的应用场景:

    Key的命名建议:
    key名称区分大小写;key不要太长,尽量不超过1024字节,太长会降低查找效率;在一个项目中key最好使用统一的命名模式,如user:id:password

    keys pattern           返回满足给定pattern的所有key,可以模糊匹配,如keys abc*代表abc开头的key
    exists key            判断一个key是否存在,存在返回1,不存在返回0
    expire key second        设定一个key的活动时间(秒)
    pexpire key milliseconds    设定一个key的活动时间(毫秒)
    del key            删除一个key
    ttl key             返回一个key的剩余时间,key不存在时返回-2;key存在但未设置剩余生存时间返回-1
    persist key           取消过期时间
    select dbindex         选择数据库,默认有16个,索引从0开始
    move key, dbindex        移动当前数据库中的key到dbindex数据库
    randomkey            随机返回一个key
    keyrename key, key2      重命名key
    dbsize              返回当前数据库中key的数量
    info               查看数据库信息
    config get *           实时存储收到的请求,返回相关的配置
    type(key)             返回值的类型

    flushdb             删除当前选择数据库中的所有key
    flushall            删除所有数据库中的所有key

    一、字符串String

    String是redis最基本的类型,一个键最大能存储523MB。String类型是二进制安全的。意思是redis的String可以包含任何数据。比如图片或者序列化的对象 。

    String的应用场景:

    INCR 等指令本身就具有原子操作的特性,所以完全可以利用 Redis 的 NCR、INCRBY、DECR、DECRBY 等指令来实现原子计数的效果。假如,在某种场景下有 3 个客户端同时读取了 minum 的值(值为 2),然后对其同时进行了加 1 的操作,那么,最后 bynum 的值一定是 5。不少网站都利用 reds 的这个特性来实现业务上的统计计数需求。

    赋值语法
    set key value        为key赋予值value,多次设置会覆盖旧值且无视类型
    setnx key value       为key赋予值value,如果key已存在,则不设置并返回0,否则设置并返回1。是解决分布式锁的方案之一。
    setex key time value    为key赋予值value并设定过期时间time,到期后key和value都清除。
    setrange key start end   设置指定区间范围内的值,下标从0开始,替换字符串。

    取值语法

    get key           获取指定key的value值,key不存在则返回nil
    getrange key start end   获取指定key的value的子字符串,包括start和end角标
    getbit key offset      对 key 所储存的字符串值,获取指定偏移量的bit(二进制)
    getset key value      为key设新值,同时返回旧值,key不存在返回nil
    substr(key, start, end)  返回名称为key的string的value的子串
    删值语法
    del key                  同Key

    批量写入
    mset k1 v1 k2 v2...kn vn        批量设置多个的值

    批量读出

    mget k1 k2 ... kn           获取多个key的值
    自增自减
    incr key                key的value对应+1
    incrby key integer           key的value对应+integer
    decr key                key的value对应-1
    decrby key integer           key的value对应-integer

    字符串拼接
    append key value            将value附加到指定key的末尾

    msetnx(key1, value1...keyN, valueN)  同时设置多个key和value,仅key之前都不存在时生效
    字符串长度
    strlen key                返回key的字符长度

    二、双重键值对Hash

    Hash类型是String类型的field和value的映射表。Hash特别适合用于存储对象,相比String可以占用更少的磁盘空间,可以看成具有key和value的map容器。Redis中每个hash可以存储(2^32)-1个键值对。

    Hash的应用场景:

    赋值语法

    hset key field value          为指定key设置field和value
    hsetnx key field value         为指定key设置field和value,如果key已存在则不生效。
    hmset key f1 v1 f2 v2 ... fn vn   同时将多个field-value(域值对)设置到哈希表的key中。

    取值语法

    hget key field             根据field获取value值
    hmget key f1 f2 ... fn        根据多个field获取所有的value值
    hgetall key              获取Hash表中所有的字段和值
    hkeys key               获取所有Hash表中的字段
    hvals key               获取所有Hash表中的字段对应的value
    hexists key field           查看Hash表Key中,指定的字段是否存在
    hlen key                获取Hash表中字段的数量

    删除语法

    hdel key field1 field2 ... fieldn  删除一个或多个Hash表的字段
    del key                 同Key

    增减语法

    hincrby key field integer       为Hash表Key中field对应的value增加integer
    hincrbyfloat key field increment   为Hash表Key中field对应的value增加increment

    三、双端链表List

    List类型是一个链表结构的集合,主要功能有push、pop、获取元素等。更详细的说,List类型是一个双端链表的结构,可以通过相关的操作进行集合头部或者尾部元素的添加和删除,List既可以作为栈,又可以作为队列,能够满足绝大多数需求。

    • 如果键不存在,创建新的链表。
    • 如果键已存在,新增内容。
    • 如果值全移除,对应的键也就消失了。
    • 链表操作无论是头和尾效率都极高,但中间元素的操作效率很低。

    应用场景

    赋值语法

    lpush key value1 value2 ... valueN    将一个或多个值插入到列表头部(从左侧添加)
    rpush key value1 value2 ... valueN     将一个或多个值插入到列表头部(从右侧添加)
    lpushx key value              将一个值插入到已存在的列表头部(最左边),如果列表不存在,操作无效。
    rpushx key value              将一个值插入到已存在的列表尾部(最右边),如果列表不存在,操作无效。

    取值语法

    llen key             获取列表长度
    lindex key index         通过索引获取列表的元素
    lrange key start stop      获取列表指定范围内的元素

    删除语法

    lpop key            移除并获取列表的第一个元素(从左侧移除)
    lpop key            移除并获取列表的最后一个元素(从右侧移除)
    lrem key count value      删除count个值为value的key
    blpop key1 key2 timeout    移除并获取列表的第一个元素,如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止
    brpop key1 key2 timeout    移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表,直到等待超时或发现可弹出元素为止
    ltrim key start stop      对一个列表进行修剪,只保留指定区间内的元素,不在指定区间内的元素都删除。

    修改语法

    lset key index value           通过索引设置列表元素的值
    linsert key before|after world value   在列表的某个元素world前或者后插入元素value。

    高级命令

    rpoplpush source destination        移除source列表的最后一个元素,并将该元素添加到destination列表,并返回。(可以对自己本身操作,类似队列)
    brpoplpush source destination timeout   移除source列表的最后一个元素,并将该元素添加到destination列表,并返回;如果source 列表没有元素会阻塞列表知道等待超时或发现可移除元素为止。

    四、无序集合Set

    Set 是 String 类型的无序集合。集合成员是唯一的,集合中不能出现重复的数据。
    Redis 中的集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
    集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
    类似于JAVA中的 Hashtable集合

    • Redis的set的底层存储结构特别神奇,底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。
    • intset内部其实是一个数组(int8_t coentents[]数组),而且存储数据的时候是有序的,因为在查找数据的时候是通过二分查找来实现的。

    应用场景

    赋值语法

    sadd key member1 member2 ... memberN   向集合添加一个或多个成员

    取值语法

    scard key                  获取集合的成员数
    smembers key                返回集合中的所有成员
    sismember key member           判断 member 元素是否是集合 key 的成员(开发中:验证是否存在判断)
    srandmember key count            返回集合中一个或多个随机数

    删除语法

    srem key member1 member2...memberN     移除集合中一个或多个成员
    spop kye count               移除并返回集合中的一个或多个随机元素

    smove source destincation member      将member元素从source集合移动到destination集合

    差集语法

    sdiff key1 key2               返回给定所有集合的差集(左侧)
    sdiffstore destination key1 key2      返回给定所有集合的差集并存储在 destination 中(destination中原有的数据清除)

    交集语法

    sinter key1 key2               返回给定所有集合的交集(共有数据)
    sinterstore destination key1 key2     返回给定所有集合的交集并存储在 destination 中

    并集语法
    sunion key1 key2               返回所有给定集合的并集
    sunionstore destination key1 key2      所有给定集合的并集存储在 destination 集合中

    五、有序集合Zset

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

    • 之前的set是k1 v1 v2
    • 现在的zset是k1 score1 v1 score2 v2

    应用场景

    赋值语法
    zadd key score1 member1 score2 member2  向有序集合添加一个或多个成员,或者更新已存在成员的分数

    取值语法
    zcard key                  获取有序集合的成员数
    zcount key min max             计算在有序集合中指定区间分数的成员数
    zrank key member              返回有序集合中指定成员的索引
    zrange key start stop [withscores]     通过索引区间返回有序集合成指定区间内的成员(低到高)
    zrevrange key start stop [withscores]   通过索引区间返回有序集合成指定区间内的成员(高到低)
    zlexcount key,min,max           在有序集合中计算指定字典区间内成员数量

    删除语法
    del key                   移除集合
    zrem key member [member ...]        移除有序集合中的一个或多个成员
    zremrangebyrank key start stop       移除有序集合中给定的排名区间的所有成员(第一名是0)(低到高排序)
    zremrangebyscore key min max        移除有序集合中给定的分数区间的所有成员

    分数自增
    zincrby key ncrement member        有序集合中对指定成员的分数加上增量increment

    六、HyperLoglog

    Redis在2.8.9版本添加了HyperLoglog结构。该结构是用来做基数统计的算法,

    优点:无论输入元素多少,计算基数所需要的空间总是固定的,并且很小。

    缺点:只会根据输入元素的计算基数,而不会存储输入元素本身,索引不能像集合那样,返回输入的各个元素。

    什么是基数?
    比如数据集{1,2,3,3,4,5,5},那么这个数据集的基数集为{1,2,3,4,5},基数为5。所谓基数估计就是在误差可接受的范围内,快速计算基数。
    为什么要使用HyperLogLog?
    传统的统计一个对象的基数值需要12M内存,如果统计1万个对象,需要将近120G内存,无法广泛应用于大数据场景;而使用了HyperLogLog,统计1亿个数据的基数值,大约需要12M,内存占用减少明显。

    在这里插入图片描述
    pfadd key element1 element2 ... elementN         添加指定元素到HyperLogLog中
    pfcount key                        返回给定HyperLogLog的基数估算值
    pfmerge destkey sourcekey1 sourcekey2 ...sourcekeyN   将多个HyperLogLog合并为一个HyperLogLog

    更多相关免费学习推荐:redis

    以上就是总结Redis常用数据类型操作指令的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:Redis
    上一篇:redis事件处理流程分析 下一篇:介绍redis分布式锁
    第15期线上培训班

    相关文章推荐

    • 一篇Lumen使用Redis指南• redis有哪几种启动方式• 使用redis数据库存储用户信息• 深入分析Redis• 详解php基于redis的list型数据结构实现ip限流操作• redis中的几种常用基础对象介绍• redis事件处理流程分析

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网