Redis提供了5种数据结构,以下介绍一些预备知识以及Redis的5种数据结构

1、预备知识

1.1 全局命令

Redis的5种数据结构,它们是键值对中的值,对于键来说有一些通用的命令。

(1)查看所有的键

 keys *

(2)键总数

 dbsize

dbsize会返回当前数据库中键的总和,例如当前数据库中有4个键即hello java python mylist,所以测试结果为4。注意,dbsize在计算键总数时不会遍历所有的键,而是直接获取

Redis内置的键总和的变量,所以此命令的时间复杂度为O(1)。然而命令keys *会遍历所有的键,所以它的时间复杂度为O(n)。当Redis保存了大量的键时,线上环境禁止使用命令keys * 。

(3)检查键是否存在

 exists key

如果键存在则返回1,不存在则返回0。

(4)删除键

 del key [key1 ...]

del是一个通用命令,无论键值是何种数据结构,del命令都可以将其删除,例如删除键值类型为字符串类型的java以及类型为列表类型的mylist。

返回结果为成功删除键的个数,假设删除一个不存在的键,就会返回0。同时del命令支持同时删除多个键。

(5)键过期

 expire key seconds

Redis支持对键添加过期时间,当超过过期时间后,将会自动删除键,例如为键hello设置了10秒的过期时间。

这里的ttl命令会返回键的剩余过期时间,它有3种返回值:

  • 大于或等于0的整数:键剩余的过期时间
  • -1:键没有设置过期时间
  • -2:键不存在

(6)键的数据类型

 type key

例如键hello是字符串类型,返回结果为string。键mylist是列表类型,返回结果为list。如果键不存在,则返回none

1.2 数据结构及内部编码

在终端可以使用object encoding命令查询内部编码。

2、字符串

字符串类型是Redis最基础的数据结构,首先键都是字符串类型,而其他几种数据结构都是在字符串类型的基础上构建的,所以字符串类型能为其它4种数据结构的学习奠定基础。字符串的类型可以使字符串(简单字符串、复杂字符串(例如json以及XML))、数字(整型、浮点数)、二进制(图片、音视频)。但是占用的空间最大不能超过512M。

2.1 命令

2.1.1 常用命令

(1)设置值

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

上述命令的常用选项:

  • ex seconds:为键设置秒级过期时间。
  • px milliseconds:为键设置毫秒级过期时间。
  • nx:键必须不存在,才能设置成功,用于添加。
  • xx:与nx相反,键必须存在,才能设置成功,用于更新。

除了set选项,Redis还提供了setex和setnx两个命令,他们的作用与ex和nx选项是一样的。

 setex key seconds value
setnx key value

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

(2)获取值

 get key

如果要获取的值不存在,则返回nil(空)

(3)批量设置值

 mset key value [key value ...]

(4)批量获取值

 mget key [key ...]

如果有些键不存在,则它的值为nil(空),结果是按照传入键的顺序返回的:

关于使用n次get获取n条结果与使用1次mget获取n条结果的比较:

使用get命令:n次get时间 = n次网络时间+n次命令时间

使用mget命令:n次get时间 = 1次网络时间+n次命令时间

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

(5)计数

 incr key

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

  • 值不是整数,返回错误
  • 值是整数,返回自增结果
  • 键不存在,按照值为0自增,返回结果为1

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

2.1.1 不常用命令

(1)追加值

 append key value

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

(2)字符串长度

 strlen key

需要注意的是中文占两个字节。命令返回的是当前value所占的字节数。

(3)设置并返回原值

 getset key value

getset和set一样会设置值,但是不同的是,它同时会返回原来的值。

(4)设置指定位置的字符

 setrange key offeset value

(5)获取部分字符串

getrange key start end

start和end分别是开始和结束的偏移量,偏移量是从0开始计算。例如下述操作获取了值bast的前两个字符。

下表是字符串类型命令的时间复杂度。

2.2 内部编码

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

  • int:8个字节的长整型
  • embstr:小于等于39个字节的字符串
  • raw:大于39个字节的字符串

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

2.3 典型使用场景

2.3.1 缓存功能

2.3.2 计数

2.3.3 共享Session

2.3.4 限速

【redis 学习系列】API的理解与使用(一)的更多相关文章

  1. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  2. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  3. 分布式缓存技术redis学习系列

    分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...

  4. redis学习系列

    redis学习系列 基本看完 最近在看redis的代码,简单记录下自己认为重要的点,自己写比较费时间的,我会把查到的资料贴出来方便查看 淘宝的redis内存分析 http://www.searchtb ...

  5. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

  6. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

  7. C# Redis学习系列二:Redis基本设置

    上一篇:C# Redis学习系列一:Redis的认识.下载.安装.使用 一.redis 设置密码 使用下载好的 redis-cli.exe 指令: 1.设置密码: config set require ...

  8. Redis学习系列一Linux环境搭建

    1.简介 Redis是互联网技术架构中在存储系统中用的最广泛的中间件,是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一.所以Redis是.Net技术开发必须掌握的技能之一.所以通过这个系列的随 ...

  9. 【redis 学习系列】API的理解与使用(二)

    3.哈希 几乎所有的语言都支持了哈希(hash)类型.在Redis中,哈希类型是指键值本身又是一个键值对结构,形如:value = {{field, value} ... {field, value} ...

随机推荐

  1. 学习MeteoInfo二次开发教程(十二)

    1.添加新的Form窗体: 在解决方案资源管理器中,右键MeteoInfoDemo,“添加”,“Windows 窗体” 2.新窗体中添加好layersLegend1和Layout之后,要把layers ...

  2. (二)获取Access_token

    获取access_token access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token.开发者需要进行妥善保存.access_token的存储至少要保 ...

  3. 秘制牛肉Alpha阶段项目展示

    秘制牛肉Alpha阶段项目展示 1.团队成员和个人博客 · 左顺:"我是左顺,秘制牛肉队开发人员". · 王尖兵:"C,java,html5都会一点的菜鸡,没做过团队项目 ...

  4. package.json文件解析

    1.用途:管理你所安装的npm包的依赖,在开发过程中能清楚的查询安装的包的版本以及项目中使用的包依赖,便于开发组成员共享. 2.创建:可以手动创建也可以通过npm init 自动创建. 3.配置项: ...

  5. openssl error while loading serial number

    unable to load number from D:/Program Files/OpenSSL-Win64/bin/demoCA/serialerror while loading seria ...

  6. 关于JWTtoken的管理问题

    JWT简介: Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准.因为网络上有很多关于jwt的详细介绍了,所以我这里就不再赘述.但是JWT的大 ...

  7. 2522 和为K的倍数

    2522 和为K的倍数 2 秒 262,144 KB 10 分 2 级题   小b喜欢和为K的倍数的序列. 现在有一个长度为n的序列A,请问A有多少个非空连续子序列是小b喜欢的. 收起   输入 第一 ...

  8. vscode更新后 ctrl+v、ctrl+c、ctrl+x不可以用了,而且光标变粗,已解决

    vscode更新后 ctrl+v.ctrl+c.ctrl+x不可以用了,而且光标变粗,已解决 原因是 你的vscode里面安装了 vim ,简单粗暴的方法就是直接卸载掉就可以了. 卸载vim方法:在v ...

  9. 学会使用box-sizing布局

    盒子模型 关于CSS重要的一个概念就是CSS盒子模型.它控制着页面这些元素的高度和宽度.盒子模型多少会让人产生一些困惑,尤其当涉及到高度和宽度计算的时候.真正盒子的宽度(在页面呈现出来的宽度)和高度, ...

  10. mysql-day1

    -- 数据库的操作 -- 链接数据库 mysql -uroot -p mysql -uroot -pmysql -- 退出数据库 exit/quit/ctrl+d -- sql语句最后需要有分号;结尾 ...