Redis数据类型

作者: huxt | 来源:发表于2019-06-25 13:27 被阅读0次

    数据结构和内部编码

    type命令实际返回的就是当前键的数据结构类型,它们分别是: string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集 合)

    每种数据结构都有自己底层的内部编码实现,而且是多种实现, 这样Redis会在合适的场景选择合适的内部编码

    可以通过object encoding命令查询内部编码

    127.0.0.1:6379> object encoding hello 

    "embstr" 

    127.0.0.1:6379> object encoding mylist 

    "ziplist"

    单线程架构

    Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库 服务

    为什么单线程还能这么快

    第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大 约为100纳秒,这是Redis达到每秒万级别访问的重要基础

    第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,再加上 Redis自身的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不 在网络I/O上浪费过多的时间

    第三,单线程避免了线程切换和竞态产生的消耗。

    但是单线程会有一个问题:对于每个命令的执行时间是有要求的。如果 某个命令执行过长,会造成其他命令的阻塞,对于Redis这种高性能的服务 来说是致命的

    字符串

    字符串类型的值实际可以 是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能 超过512MB。

    1.常用命令

    set key value [ex seconds] [px milliseconds] [nx|xx]

    set命令有几个选项:

    ·ex seconds:为键设置秒级过期时间。

    ·px milliseconds:为键设置毫秒级过期时间。

    ·nx:键必须不存在,才可以设置成功,用于添加。

    ·xx:与nx相反,键必须存在,才可以设置成功,用于更新。

    除了set选项,Redis还提供了setex和setnx两个命令:

    setex key seconds value 

    setnx key value

    setnx和setxx在实际使用中有什么应用场景吗?以setnx命令为例子,由于 Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value, 根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种 实现方案,Redis官方给出了使用setnx实现分布式锁的方

    获取值

    get key

    批量设置值

    mset key value [key value ...]

    127.0.0.1:6379> mset a 1 b 2 c 3 d 4 

    OK

    批量获取值

    mget a b c d

    如果有些键不存在,那么它的值为nil(空),结果是按照传入键的顺

    Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,对于客户端来说,一次命令除了命令时间还是有网络时间,假设网络 时间为1毫秒,命令时间为0.1毫秒(按照每秒处理1万条命令算),那么执 行1000次get命令和1次mget命令的区别如表2-1,因为Redis的处理能力已经足够高,对于开发人员来说,网络可能会成为性能的瓶颈

    学会使用批量操作,有助于提高业务处理效率,但是要注意的是每次批 量操作所发送的命令数不是无节制的,如果数量过多可能造成Redis阻塞或者网络拥塞。

    计数

    incr key

    incr命令用于对值做自增操作,返回结果分为三种情况:

    ·值不是整数,返回错误。

    ·值是整数,返回自增后的结果。

    ·键不存在,按照值为0自增,返回结果为1。

    127.0.0.1:6379> exists key 

    (integer) 0 

    127.0.0.1:6379> incr key

     (integer) 1

    再次对键执行incr命令,返回结果是2:

    127.0.0.1:6379> incr key 

    (integer) 2

    除了incr命令,Redis提供了decr(自减)、incrby(自增指定数字)、 decrby(自减指定数字)、incrbyfloat(自增浮点数)

    追加值

    append key value

    append可以向字符串尾部追加值,

    127.0.0.1:6379> get key 

    "redis" 

    127.0.0.1:6379> append key world 

    (integer) 10 

    127.0.0.1:6379> get key 

    "redisworld"

    字符串长度

    127.0.0.1:6379> strlen key 

    (integer) 10

    每个中文占用3个字节

    127.0.0.1:6379> set hello "世界" 

    OK 

    127.0.0.1:6379> strlen hello 

    (integer) 6

    设置并返回原值

    127.0.0.1:6379> getset hello world 

    (nil) 

    127.0.0.1:6379> getset hello redis 

    "world"

    设置指定位置的字符

    下面操作将值由pest变为了best:

    127.0.0.1:6379> set redis pest 

    OK 

    127.0.0.1:6379> setrange redis 0 b 

    (integer) 4 

    127.0.0.1:6379> get redis "best"

    获取部分字符串

    getrange key start end

    start和end分别是开始和结束的偏移量,偏移量从0开始计算

    127.0.0.1:6379> getrange redis 0 1 

    "be"

    内部编码

    字符串类型的内部编码有3种:

    ·int:8个字节的长整型。

    ·embstr:小于等于39个字节的字符串。

    ·raw:大于39个字节的字符串。

    Redis会根据当前值的类型和长度决定使用哪种内部编码实现

    127.0.0.1:6379> set key 8653 

    OK 1

    27.0.0.1:6379> object encoding key 

    "int"

    #小于等于39个字节的字符串:embstr 

    127.0.0.1:6379> set key "hello,world" 

    OK 

    127.0.0.1:6379> object encoding key 

    "embstr"

    相关文章

      网友评论

        本文标题:Redis数据类型

        本文链接:https://www.haomeiwen.com/subject/slstcctx.html