(二) redis API理解和使用


告诉大家一个联系redis的网站

http://try.redis.io

1、全局变量

redis有五种数据结构,他们是键值对中的值,对于key来说有一些通用的命令。

  • keys *:获取redis的所有键,强烈不推荐使用在实战中。O(n)

  • dbsize:键的总数。在计算键的总数不会去一一遍历,而是直接读取redis内置的键总数变量,时间复杂度O(1)

  • exists key:检查键是否存在,这个很实用,一般实战中首先先执行一下这个命令。

  • del key:删除键

  • expire key seconds:redis支持对键添加过期时间,当超过过期时间后,会自动删除键。eg:expire hello 10

  • ttl key:查看键的状态

    • 大于等于0的整数,键剩余时间。
    • -1:没有设置过期时间
    • -2:键不存在
  • type key:键的数据结构类型

2、数据结构和内部编码

数据结构种类:string、hash、list、set、zset、bitmaps、hyperloglog

注意】:每种数据结构底层的内部编码都有两种以上。

熟悉他们,会成为业务上的好帮手。

在这里插入图片描述​​在这里插入图片描述
​​​​​​
这两张图,形象的告诉了我们前五种基本数据结构的结构和内部编码。

我们都知道redis是单线程设计,那么问题来了,我们不是说多线程程序处理速度更快吗,那么redis的单线程是如何保证高效的?

1、纯内存访问,处理速度可以达到每秒万级别访问。

2、非阻塞IO,redis使用epoll作为IO多路复用技术实现,再加上redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在网络IO上浪费太多时间。

3、单线程避免了线程切换和竞态产生的消耗。

通用查看编码方式 object encoding key

2.1、字符串

  • 命令:

  • 内部编码:

    • int:8个字节的长整型
    • embstr:<=39个字节的字符串
    • raw:>39个字节的字符串
  • 使用场景:缓存功能、计数、共享session(分布式服务记录session)、限速(短信接口不会被频繁访问)

2.2、哈希

hash就是指一对键值对,redis下形如value={{field1,value}, {field2, value}…}

  • 命令:

    • hset key field value 设置值
    • hget key field 获取值
    • hdel key field 删除值
    • hlen key 计算key下有几组数
    • 批量插入和获取
      • hmset key field value [ field value…]
      • hmget key field [field…]
    • hexist key field 判断field是否存在
    • hkeys key 获取所有field
    • hvals key 获取所有value
    • hgetall key 获取所有filed -value, 甚用会阻塞redis。
    • hstrlen key field 获取value的字符串长度
  • 内部编码:
    哈希内部编码有两种ziplisthashtable
    ziplist(压缩列表):实现多个元素连续存储,结构更加紧凑,占用内存更小,当哈希元素个数小于配置的hash-max-ziplist-entries的值,且value的每个值的长度都小于hash-max-ziplist-value时使用。
    hashtable(哈希表):当无法满足ziplist的条件时,会使用hashtable,因为此时ziplist的读写效率会下降,hashtable的时间复杂度是O(1)。
    这里有更加详细的讲解,对两种编码实现

  • 使用场景:
    用户信息,关系型数据库使用行记录数据,如果我们使用redis的hash结构存储用户信息会比字符串更加紧凑直观,而且便于更新操作可以将多个用户的id定义为key后缀,field-value记录用户信息。
    对于缓冲用户信息我们有三种方式
    1、 使用原生的字符串:每个属性一对键值,简单直观,每个键都可以直接更新,但是键比较松散,占用过多的键,占用内存较多。
    2、 序列话字符串:比原生字符串信息更集中,提高内存的使用率,但是序列化和反序列化带来一定的开销
    3、 使用hash存储:简单直观,在控制好编码方式的情况下可以大大减少内存的使用。

2.3、列表

列表用来存放多个连续有序的字符串,可以当做队列和栈使用。
一个列表最多可以存放2^23 -1个元素。
列表有两个特点
第一:元素是有序的,这就意味着可以通过索引获取某个元素或者范围内的元素列表。
第二:列表中的元素是可以重复的。

  • 命令:

操作类型命令
添加rpush、lpush、linsert
lrange、llen、lindex
删除lpop、rpop、ltrim、lrem
修改lset
阻塞操作blpop、brpop
  • 内部编码:
  • ziplist(压缩列表):实现多个元素连续存储,结构更加紧凑,占用内存更小,当哈希元素个数小于配置的hash-max-ziplist-entries的值,且value的每个值的长度都小于hash-max-ziplist-value时使用。
  • linkedlist(链表):当列表类型无法满足ziplist的条件时,redis会使用linkedlist作为列表的内部实现。
  • 使用场景:
    消息队列:redis的lpush+brpop 命令组合使用就可以实现阻塞列。
    在这里插入图片描述

2.4、集合

  • 命令:

  • 内部编码:

  • 使用场景:

2.5、有序集合

  • 命令:
  • 内部编码:
  • 使用场景:

2.6、键管理

1、键重命名:rename key newkey
注意:要是rename前key存在,怎rename后的值也会被覆盖
为了防止这种情况发生,redis提供了renamenx,确保只有newKey不存在的时候才覆盖。
在这里插入图片描述
2、随机返回一个键
randomkey
3、键过期

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值