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

  • 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。

  1. Strings

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

命令:

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

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

Hash适合存取对象。

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

存取结构分析:

使用String模式存取:

https://img-blog.csdn.net/20130506195958936

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

String的存取模式(二)

https://img-blog.csdn.net/20130506200011015

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

https://img-blog.csdn.net/20130506200040811

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

命令:

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

时间复杂度:

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

Puclic class demo{

For(int i=0;i<n;i++){

执行n次}}

时间复杂度:O(n)

Puclic class demo{

For(int i=0;i<n;i++){

执行n次

For(int j=0;j<n;j++){

执行n2次}}}

时间复杂度:O(n2)

Puclic class demo{

For(int i=0;i<n;i++){

执行n次

For(int j=0;j<n;j++){

执行n2次}}

For(int j=0;j<n;j++){

执行n2+n次}}

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

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

询获取2节点数据:

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

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

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

双向链表:

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

命令:

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

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

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

有序的set集合。

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

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

命令:

  1. zadd myzset 10 one 12 two 16 three
    1. 给有序集合myzset设置one,two,three三个元素,并设置得分。
  2. zcount myzset -inf +inf
    1. 统计集合myzset元素个数
    2. –inf:最小分数
    3. +inf:最大分数
  3. zcount myzset 10 16
    1. 统计分数在10到16元素个数
    2. 默认是闭区间。
  4. zcount myzset (10 16
    1. 统计分数在10(开区间)到16元素个数
    2. 不包含10
  5. zrange myzset 0 -1 withscores
    1. 查询集合myzset所有元素名称和分数。
  6. zrangebyscore myzset 10 16 withscores limit 1 1
    1. 查询myzset集合10到16数据,从角标1开始查询,每页显示1条。
  1. Keys
  1. 查询所有key
    1. Kyes *
  2. expire myset1 6
    1. 给key是myset1设置6秒过期时间。
  1. 多实例数据库

ORACLE:windows 服务:oracleServiceORCL

                                       oracleServiceXE

                                          oracleServiceBOS

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值