API的理解和使用——字符串的命令
| 命令 | 作用 |
| set | |
| setex | |
| setnx | |
| get | |
| mset | |
| mget | |
| incr | |
| decs | |
| incrby | |
| decrby | |
| incrbyfloat | |
| append | |
| strlen | |
| getset | |
| setrange | |
| getrange |
字符串类型是Redis最基础的数据结构。首先键都是字符串类型。
而且其他几种数据结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习奠定基础。
字符串类型的值可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数)、
甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。
字符串类型的命令比较多,我们将其分为常用的和不常用的两类。
1.字符串常用命令
1)设置值
命令:set key value [ex seconds] [px milliseconds] [nx|xx]
set命令的可选参数:
ex seconds:为键设置秒级过期时间。
px milliseconds:为键设置毫秒级过期时间。
nx:键必须不存在,才可以设置成功,用于添加。
xx:与nx相反,键必须存在,才可以设置成功,用于更新。
127.0.0.1:> set name kebi
OK
127.0.0.1:> set name kebi ex xx
OK
127.0.0.1:> set age nx
OK
除了set,Redis还提供了setex和setnx两个命令
语法:
setex key seconds value
setnx key values
setex和setnx可以看作set的专业定制版,适合某些场合。
ex是用来设置时间的,所以后面必须接时间。
nx是键必须不存在,所以不能用来更新。
127.0.0.1:> set age nx
OK
127.0.0.1:> setnx age
(integer) #设置失败,setnx必须设置不存在的
127.0.0.1:> set age
OK #可以更新
127.0.0.1:> setex name kebi
OK #可以更新
setnx和setex有什么用了?
以setnx命令为例,由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,
根据setnx的特性只有一个客户能设置成功,setnx可以作为一种分布式锁的一种实现方案。
2)获取值
命令:get key
127.0.0.1:> get age
""
127.0.0.1:> get age_kebi
(nil)
如果要获取的键不存在,则返回nil(空)。
3)批量设置值
命令:mset key value [key value...]
下面操作通过mset命令一次性设置4个键值对:
127.0.0.1:> mset a b c d
OK
4)批量获取值
命令:mget [key...]
下面操作批量获取4个键的值:
127.0.0.1:> mget a b c d
) ""
) ""
) ""
) ""
如果有些键不存在,那么它的值为nil(空),结果是按照传入键的顺序返回:
127.0.0.1:> mget a b c f
) ""
) ""
) ""
) (nil)
批量操作命令可以有效提高开发效率,假如没有mget这样的命令,要执行n次get命令需要按照如下方式来执行:

具体耗时:n次get时间 = n次网络时间 + n次命令时间
使用mget命令后,要执行n次get命令操作只需要按照如下方式即可:

具体耗时:n次get时间 = 1次网络时间 + n次命令时间
Redis可以支撑每秒数万的读写操作,但是这指的是Redis服务端的处理能力,
对于客户端来说,一次命令除了命令时间还有网络时间,假设网络时间为1毫秒,命令时间为0.1毫秒,
按照每秒处理一万次命令算,那么执行1000次get命令和一次mget命令的区别在于:
| 操作 | 时间 |
| 1000次get | 1000 x 1 + 1000 x 0.1 = 1100毫秒 = 1.1秒 |
| 1次mget(组装了1000个键值对) | 1 x 1 + 1000 x 0.1 = 101毫秒 = 0.101秒 |
因为Redis的处理能力已经足够高,对于开发人员来说,网络可能成为性能的瓶颈。
学会使用批量操作,有助于提高业务处理效率,但是要注意的是每次批量操作所发送的命令不是无节制的,
如果数量过多可能造成Redis阻塞或者网络阻塞。
5)计数
命令:incr key
incr命令用于对值做自增操作,返回结果分为三种情况:
(1)值不是整数,返回错误。
(2)值是整数,返回自增后的结果。
(3)键不存在,按照值为0自增,返回结果是1.
#值不是整数
127.0.0.1:> set name kebi
OK
127.0.0.1:> incr name
(error) ERR value is not an integer or out of range #报错 #值是整数
127.0.0.1:> set age
OK
127.0.0.1:> incr age
(integer) #加1返回结果
127.0.0.1:> incr age
(integer) #值不存在,返回1
127.0.0.1:> exists sex
(integer)
127.0.0.1:> incr sex
(integer)
除了incr命令,Redis提供了decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数):
语法:
decr key
incrby key increment
decrby key decrement
incrbyfloat key increment
#值为整数
127.0.0.1:> incr sex
(integer)
127.0.0.1:> decr sex
(integer)
127.0.0.1:> decr sex
(integer) 127.0.0.1:> exists a
(integer)
127.0.0.1:> decr a
(integer)
127.0.0.1:> decr a #可以返回负数
(integer) -
127.0.0.1:> decr a
(integer) -
127.0.0.1:> decr name #不是整数报错
(error) ERR value is not an integer or out of range
decr例子
#值不存在
127.0.0.1:> exists g
(integer)
127.0.0.1:> incrby g
(integer)
127.0.0.1:> incrby g
(integer) #值不是整数
127.0.0.1:> incrby name
(error) ERR wrong number of arguments for 'incrby' command #值是整数
127.0.0.1:> decr age
(integer)
127.0.0.1:> incrby age
(integer)
127.0.0.1:> incrby age
(integer)
incrby例子
#值不存在
127.0.0.1:> exists h
(integer)
127.0.0.1:> decrby h
(integer) - #值不是整数
127.0.0.1:> decrby name
(error) ERR wrong number of arguments for 'decrby' command #值为整数
127.0.0.1:> decrby age
(integer)
127.0.0.1:> decrby age
(integer)
decrby例子
#值不是整数
127.0.0.1:> incrbyfloat name 1.5
(error) ERR value is not a valid float #值是整数
127.0.0.1:> incrbyfloat age 2.5
"28.5" #值不存在
127.0.0.1:> incrbyfloat y 2.5
"2.5"
incrbyfloat例子
注意:上面这些不同的类型指的增减数字的类型,例如是每次加1还是1.5
很多存储系统和编程语言内部都使用CAS机制实现技术功能,会有一定的CPU开销,但是在Redis中完全不存在这个问题
因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执行。
2.字符串不常用命令
1)追加值
命令:append key value
append可以向字符串尾部追加值:
127.0.0.1:> get name
"kebi"
127.0.0.1:> append name goods #追加
(integer) #返回这个值的长度
127.0.0.1:> get name
"kebigoods"
2)字符串长度
命令:strlen key
127.0.0.1:> get name
"kebigoods" #一个字母一个字节
127.0.0.1:> strlen name
(integer)
如果字符串是汉字,一个汉字占3个字节:
127.0.0.1:> set name:chinese "科比"
OK
127.0.0.1:> strlen name:chinese
(integer)
3)设置并返回原值
命令:get key value
getset和set一样能设置值,但不同的是,它会返回原值:
127.0.0.1:> getset name kebi-bryant
"kebigoods"
127.0.0.1:> getset class seven
(nil) #原值不存在返回空
4)设置指定位置的字符
命令:setrange key offeset values
127.0.0.1:> set drom
OK
127.0.0.1:> setrange drom B #替换掉指定位置的字符,可以加
(integer)
127.0.0.1:> get drom
"301B"
#注意外国人计数从0开始
#替换之后中间有空格,用十六进制补
127.0.0.1:> set drom
OK
127.0.0.1:> setrange drom B
(integer)
127.0.0.1:> get redis
(nil)
127.0.0.1:> get drom
"301\x00B"
5)获取部分字符串
命令:getrange key start end
start和end分别是开始和结束的偏移量,偏移量从0开始计算
127.0.0.1:> get name
"kebi-bryant"
127.0.0.1:> getrange name
"kebi"
最后提供一张字符串类型命令的时间复杂度,之前讲dbsize命令时提到过,可以作为参考依据。结合自身业务需求和数据大小选择适合的命令。
| 命令 | 时间复杂度 |
| set key value | O(1) |
| get key | O(1) |
| del key [key ...] | O(k),k是键的个数 |
| mset key value [key value ...] | O(k),k是键的个数 |
| mget key [key...] | O(k),k是键的个数 |
| incr key | O(1) |
| decr key | O(1) |
| decrby key decrement | O(1) |
| incrby key increment | O(1) |
| incrbyfloat key increment | O(1) |
| append key value | O(1) |
| strlen key | O(1) |
| setrange key offset value | O(1) |
| getrange key start end |
O(n),n是字符串长度,由于获取字符串非常快 所以,字符串不是很长,可以视同为O(1) |
API的理解和使用——字符串的命令的更多相关文章
- 2.API的理解和使用
标题 : 2.API的理解和使用 目录 : Redis 序号 : 2 zset的成员是唯一的,但分数(score)却可以重复. 有序集合的内部编码 1.ziplist(压缩列表):当有序集合的 ...
- Linux常用命令学习2---(文件搜索命令locate find、命令搜索命令whereis which、字符串搜索命令grep、帮助命令man)
1.文件搜索命令:locate [文件名] 在后台数据库中按文件名搜索,搜索速度比find快,耗费资源更少 例子:locate test.txt,就会显示文件名包含 test.txt的所 ...
- ES6之let(理解闭包)和const命令
ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,E ...
- qnx:从API开始理解QNX -- 消息传递
从API开始理解QNX -- 消息传递 http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161 1. 频道与连接 Chann ...
- 【redis 学习系列】API的理解与使用(一)
Redis提供了5种数据结构,以下介绍一些预备知识以及Redis的5种数据结构 1.预备知识 1.1 全局命令 Redis的5种数据结构,它们是键值对中的值,对于键来说有一些通用的命令. (1)查看所 ...
- 在Linux中批量修改字符串的命令
昨天一个朋友忽然问我,在Linux下如何批量修改字符串,当时瞬间懵逼了,完全想不起来....... 今天特意的重温了一下Linux下的一些常用命令,并将这个遗忘的批量修改字符串的命令记录下来(资料来自 ...
- 一篇文章助你理解Python3中字符串编码问题
前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解 ...
- (九)Centos之搜索命令whereis、which和字符串搜索命令grep
一.Centos之命令搜索命令whereis与which 1.1 whereis 命令名(搜索命令所在路径及帮助文档所在位置) 选项: -b :只查找可执行文件位置 -m:只查找帮助文件 1.2 wh ...
- API的理解和使用——列表类型的命令
列表类型的命令及对应的时间复杂度 操作 命令 功能 时间复杂度 添加 rpush key value [value ...] 向右插入 O(k),k是元素个数 lpush key value [val ...
随机推荐
- 【spring boot logback】日志logback 生成日志文件在本项目下,而不在指定的日志文件目录下/指定日志文件到达最大值后不按照配置进行切割
原本的日志文件配置如下: <?xml version="1.0" encoding="UTF-8"?> <configuration scan ...
- hdu254 DFS+BFS
这个题目需要注意以下几点: 1)注意界线问题,箱子和人不可以越界. 2)需要判断人是否可以到达人推箱子的指定位置. 3)不可以用箱子作为标记,因为箱子可以走原来走过的地方,我们用箱子和人推箱子的方向来 ...
- Protel中的快捷键使用(网上资源)
使用快捷键之前,将输入法切换至中文(中国)状态 Enter——选取或启动 Esc——放弃或取消 F1——启动在线帮助窗 Tab——启动浮动图件的属性窗口 Page Up——放大窗口显示比例 Page ...
- Java架构师与开发者提高效率的10个工具
Java受到全球百万计开发者的追捧,已经演变为一门出色的编程语言.最终,这门语言随着技术的变化,不断的被改善以迎合变化的市场需求. 无论你是否拥有一家科技公司,软件已经成为几乎每一个企业不可或缺的一部 ...
- PHP树生成迷宫及A*自己主动寻路算法
PHP树生成迷宫及A*自己主动寻路算法 迷宫算法是採用树的深度遍历原理.这样生成的迷宫相当的细,并且死胡同数量相对较少! 随意两点之间都存在唯一的一条通路. 至于A*寻路算法是最大众化的一全自己主动寻 ...
- Web开发框架 SSH 简介
Struts 是一个很好的MVC框架,主要技术是Servlet和Jsp.Struts的MVC设计模式可以使我们的逻辑变得很清晰,让我们写的程序层次分明. 官方地址:http://struts.apac ...
- Testin云測手游质量管家 七大兵器助CP称霸江湖
Testin云測手游质量管家 七大兵器助CP称霸江湖 2014/09/29 · Testin · 产品评測 在武侠江湖里,高手不须要武功高强.亦要具备厉害的武器.有人的地方就有江湖.手游行业相同腥风血 ...
- 网站添加ico图标
打开某一个网页会在浏览器的标签栏处显示该网页的标题和图标,当网页被添加到收藏夹或者书签中时也会出现网页的图标,怎么在网页title左边显示网页的logo图标呢? 方法一(被动式): 制作一个ico格式 ...
- 自定义序列化4 (MFC调用C#的.dll)
CLR:CLR常用简写词语,CLR是公共语言运行时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系 ...
- Spring2.5学习3.2_编码剖析@Resource注解的实现原理
首先看一下J2EE提供的@Resource注解:该注解默认安照名称进行装配,名称能够通过name属性进行指定, 假设没有指定name属性,当注解写在字段上时,默认取字段名进行依照名称查找,假设注解写在 ...