Redis核心技术进阶一(数据结构)

发布于:2021-07-22 07:33:52

Redis数据结构

redis是一种高级的key:value存储系统,其中value支持五种数据类型:


1.字符串(strings)


2.字符串列表(lists)


3.字符串集合(sets)


4.有序字符串集合(sorted sets)


5.哈希(hashes)


而关于key,有几个点要提醒大家:


1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;


2.key也不要太短,太短的话,key的可读性会降低;


3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。


    Strings

Redis是一个key:value类型数据库,value的数据结构是Strings。


命令:


    set username zhangsan
      给key是Username设置值:zhangsan
    get username
      获取key为Username的值。
    incr age
      把age数字类型字符串强制转换成interger,自增1
    incrby age 10
      把age数字类型字符串强制转换成interger,加上10
    decr age
      把age数字类型字符串强制转换成interger,自减1
    decrby age 10
      把age数字类型字符串强制转换成interger,减去10

    Hashes

Redis数据结构是key:value,value是hash结构数据。


Hash适合存取对象。


Key:对象属性,value:可以是一个对象属性值。


存取结构分析:


使用String模式存取:



使用String存储对象,必须使用序列化反序列化。增加IO开销。系统性能降低。


String的存取模式(二)



上面数据存储结构已经经过优化。但是发现:用户ID无限重复,增加开销。



上面这种数据存取结构满足redis存储要求:


命令:


    hset user username lisi
      给User对象的属性Username设置值lisi
    hget user username
      获取User对象中Username属性值。
    hexists user username
      判断User对象中是否有Username属性
    hdel user age email
      删除User对象中age和email属性
    hsetnx user username lisi
      如果User对象中Username属性存在,不进行覆盖。如果不存在,创建一个,设置值。
    hmset user email 11@qq passwd 123
      同时给User对象设置多个属性和属性值
    hmget user username age
      同时获取对象多个属性值。

    Lists

时间复杂度:


程序执行次数。叫做时间复杂度。


Puclic class demo{


For(int i=0;i


执行n次}}


时间复杂度:O(n)


Puclic class demo{


For(int i=0;i


执行n次


For(int j=0;j


执行n2次}}}


时间复杂度:O(n2)


Puclic class demo{


For(int i=0;i


执行n次


For(int j=0;j


执行n2次}}


For(int j=0;j


执行n2+n次}}


时间复杂度:O(n2+n)


List结构在redis表现形式:链表结构。


询获取2节点数据:


    首先经过头指针(地址)从头指针开始寻找,一直找到2号节点。

缺点:如果数据较多,查询效率较慢,时间复杂度O(n)


优点:插入数据快,时间复杂度O(1)


双向链表:


Redis数据结构使用双向链表。List结构数据可以重复。


命令:


    Lpush mylist a b c d e f
      给链表mylist设置了6个值
    Lrange mylist 0 -1
      获取链表所有元素0:表示首元素-1:表示尾元素。
    Lpop mylist
      出栈mylist链表。(出栈后的元素消失)
    lrem mylist 3 a
      删除链表mylist中前3个a
    lset mylist 1 s
      在mylist链表指定位置(链表角标)设置一个值。
    linsert mylist after e f
      在mylist链表元素第一个e后面设置f
    rpush mylist e f g
      从链表尾部插入元素
    RPOPLPUSH source destination?
      source链表出栈一个元素,把元素设置链表destination链表。

    Set

Redis的set数类型:数据不允许重复。


    sadd myset a b c d
      给set集合myset添加元素a b c d
    Smembers myset
      获取集合myset元素
    spop myset
      出栈
    srem myset a b
      删除myset集合的2个元素。
    smove myset myset1 c
      从myset移动c元素到myset1

    SortedSets

有序的set集合。


根据set集合元素分数进行排序:


    分数允许重复Set集合数据元素不允许重复。

命令:


    zadd myzset 10 one 12 two 16 three
      给有序集合myzset设置one,two,three三个元素,并设置得分。
    zcount myzset -inf +inf
      统计集合myzset元素个数?inf:最小分数+inf:最大分数
    zcount myzset 10 16
      统计分数在10到16元素个数默认是闭区间。
    zcount myzset (10 16
      统计分数在10(开区间)到16元素个数不包含10
    zrange myzset 0 -1 withscores
      查询集合myzset所有元素名称和分数。
    zrangebyscore myzset 10 16 withscores limit 1 1
      查询myzset集合10到16数据,从角标1开始查询,每页显示1条。

    Keys

    查询所有key
      Kyes *
    expire myset1 6
      给key是myset1设置6秒过期时间。

    多实例数据库

ORACLE:windows 服务:oracleServiceORCL


?????????????????????????????????? ??? oracleServiceXE


????????????????????????????????????????? oracleServiceBOS


redis是一个多实例数据库:16个数据,排列:0?15


    Redis默认进入0号数据库进入其他数据库:select 角标,进行角标所在数据库。例如:select 1,进入1号数据库。测试多实例数据库
      Move mylist 1

把0号数据库mylist集合移动1号数据库。

相关推荐

最新更新

猜你喜欢