Redis API的理解和使用

一、通用命令

  • keys 用于查找所有符合给定模式 pattern 的 key
    keys在生产环境中一般不使用,因为keys会阻塞其他命令。
  • dbsize 返回当前数据库的 key 的数量
  • exists key 用于检查给定 key 是否存在,存在返回1,不存在返回0
  • del 删除一个/多个key
  • expire key seconds 设置key的过期时间
    ttl key 查看key剩余过期时间,persist key 去掉key的过期时间
  • type key 查看key的数据类型

以上除了keys的时间复杂度为O(n),其余时间复杂度都是O(1)。

二、单线程

Redis是单线程的,同一时间只能执行一个命令。

那为什么单线程还能这么快?

  1. 纯内存
  2. 非阻塞IO,使用IO多路复用
  3. 避免线程切换和竞态消耗

所以在使用的时候,要避免慢命令,会影响之后的命令执行。

三、数据结构和内部编码

在这里插入图片描述
数据结构是对外的,内部编码是对内的实现。
在这里插入图片描述
redis内部使用一个redisObject对象来表示所有的key和value,redisObject最主要的信息如上图所示:type表示一个value对象具体是何种数据类型,encoding是不同数据类型在redis内部的存储方式。

1.字符串string

所有的key都是字符串类型的,value有五种数据类型。

字符串类型常用于:缓存、计数器、分布式锁……

字符串中也可以存数值,所以可以进行自增(incr)、自减(decr)操作

(1)字符串常用命令
  • set设置key value,setnx key不存在才能设置,setxx key存在才能设置
  • get key 获取key对应的value
  • msetmget 批量操作(时间复杂度O(n))
  • incr 自增,decr自减,以及incrby decrby incrbyfloat
  • getset 获取并设置值
  • append 追加value
  • strlen 获取字符串长度
  • getrange key start end 获取value的某范围内的值,setrange类比
(2)底层实现

Redis并没有直接使用C语言的字符数组,而是使用SDS:

struct sdshdr {
    //记录buf数组中已使用字节的数量
    //等于SDS所保存字符串的长度
    int len;
    //记录buf数组中尚未使用的字节数量
    int free;
    //字节数组,用于保存字符串
    char buf[];
};

2.哈希hash

每一个key-value的结构如下:field、value可以动态增加、删除。
在这里插入图片描述

(1)常用命令
  • hget key field 获取hash key对应field的value
  • hset key field value 设置hash key对应field的value
  • hdel key field 删除hash key对应field的value
  • hexisets key field 判断hash key是否有field
  • hlen key 获取hash key field 的数量
  • hgetall key 获得所有field和value
    同理,还有hsetnx hincrby这样的命令。可以发现,对hash操作时,命令的格式都是以h开头的。
(2)存储对象的方式
  1. 可以用字符串去存储对象,即将对象序列化成字符串之后存入。这样的缺点在于修改比较麻烦/
  2. 用一个key存储一个对象的属性,这样太繁琐。
  3. hash来存储对象,field即对象的属性。好处是很直观,缺点是编程稍复杂,且ttl不好控制。

3.列表list

列表是一个有序、可重复的集合,是基于链表来实现的。

(1)常用命令
  • rpush key value lpush key value 在列表的右/左侧添加值
  • linsert key before|after value newValue 在list指定的值前|后插入newValue
  • blpop key timeout brpop key timeout阻塞版本插值,timeout设置为0则永不阻塞
  • lpop key rpop key从左、右边弹出元素
  • lrem key count value 删除所有与value相等的项
  • ltrim key start end 按照索引范围修剪列表,比如ltrim listkey 1 4就是保留从1到4的四个元素
  • lrange key start end 查询指定索引范围的所有item
  • lindex key index 获取列表指定索引处的元素
  • llen 获取列表长度
  • lset 设置指定索引位置为新的值

4.集合set

set是一个无序的、不可重复的集合。

(1)集合内操作API
  • sadd set element 向集合key中添加element
  • srem key element 集合key中删除element
  • scard 返回集合中元素的数量
  • sismember 判断元素是否在集合中
  • srandmember 随即返回一个集合中的元素
  • smembers 取出集合中所有元素(小心使用)
  • spop随机从集合中弹出一个元素(与srandmember区分)
(2)集合间操作API
  • sdiff s1 s2 求s1、s2的差集
  • sinter s1 s2 求s1、s2的交集
  • sunion s1 s2 求s1、s2的并集
  • sdiff|sinter|sunion + store destkey 将差集、交集、并集结果保存在destkey中

5.有序集合zset

(1)特点

在这里插入图片描述
有序集合中每一个元素都对应一个score,有序集合中的元素会按照score排序。

(2)常用命令
  • zadd key score element key代表集合名。时间复杂度是O(logN)
  • zrem key element 删除集合key中的element元素(可以删除多个)
  • zscore key element 获取element的score
  • zincrby key increScore element 增加或减少元素的分数
  • zcard key 返回有序集合元素个数
  • zrange key start end [WITHSCORES] 返回指定索引(排名)范围内的升序元素[分值],时间复杂度:O(log(n)+m)
  • zrangebyscore key minScore maxScore [WITHSCORES] 返回指定分数范围内的升序元素[分值],时间复杂度:O(log(n)+m)
  • zcount key minScore maxScore 返回指定分数范围内的元素数目,时间复杂度:O(log(n)+m)
  • zremrangebyrank key start end 删除指定索引范围内元素,时间复杂度:O(log(n)+m)
  • zremrangebyscore key start end 删除指定分数范围内元素,时间复杂度:O(log(n)+m)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值