字符串的命令复习表
命令 作用
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相反,键必须存在,才可以设置成功,用于更新。

  1. 127.0.0.1:> set name kebi
  2. OK
  3. 127.0.0.1:> set name kebi ex xx
  4. OK
  5. 127.0.0.1:> set age nx
  6. OK

除了set,Redis还提供了setex和setnx两个命令

语法:

  1. setex key seconds value
  2. setnx key values

setex和setnx可以看作set的专业定制版,适合某些场合。

ex是用来设置时间的,所以后面必须接时间。

nx是键必须不存在,所以不能用来更新。

  1. 127.0.0.1:> set age nx
  2. OK
  3. 127.0.0.1:> setnx age
  4. (integer) #设置失败,setnx必须设置不存在的
  5. 127.0.0.1:> set age
  6. OK #可以更新
  7. 127.0.0.1:> setex name kebi
  8. OK #可以更新

setnx和setex有什么用了?

以setnx命令为例,由于Redis的单线程命令处理机制,如果有多个客户端同时执行setnx key value,

根据setnx的特性只有一个客户能设置成功,setnx可以作为一种分布式锁的一种实现方案。

2)获取值

命令:get key

  1. 127.0.0.1:> get age
  2. ""
  3. 127.0.0.1:> get age_kebi
  4. (nil)

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

3)批量设置值

命令:mset key value [key value...]

下面操作通过mset命令一次性设置4个键值对:

  1. 127.0.0.1:> mset a b c d
  2. OK

4)批量获取值

命令:mget [key...]

下面操作批量获取4个键的值:

  1. 127.0.0.1:> mget a b c d
  2. ) ""
  3. ) ""
  4. ) ""
  5. ) ""

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

  1. 127.0.0.1:> mget a b c f
  2. ) ""
  3. ) ""
  4. ) ""
  5. ) (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和1次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.

  1. #值不是整数
  2. 127.0.0.1:> set name kebi
  3. OK
  4. 127.0.0.1:> incr name
  5. (error) ERR value is not an integer or out of range #报错
  6.  
  7. #值是整数
  8. 127.0.0.1:> set age
  9. OK
  10. 127.0.0.1:> incr age
  11. (integer) #加1返回结果
  12. 127.0.0.1:> incr age
  13. (integer)
  14.  
  15. #值不存在,返回1
  16. 127.0.0.1:> exists sex
  17. (integer)
  18. 127.0.0.1:> incr sex
  19. (integer)

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

语法:

  1. decr key
  2. incrby key increment
  3. decrby key decrement
  4. incrbyfloat key increment
  1. #值为整数
  2. 127.0.0.1:> incr sex
  3. (integer)
  4. 127.0.0.1:> decr sex
  5. (integer)
  6. 127.0.0.1:> decr sex
  7. (integer)
  8.  
  9. 127.0.0.1:> exists a
  10. (integer)
  11. 127.0.0.1:> decr a
  12. (integer)
  13. 127.0.0.1:> decr a #可以返回负数
  14. (integer) -
  15. 127.0.0.1:> decr a
  16. (integer) -
  17. 127.0.0.1:> decr name #不是整数报错
  18. (error) ERR value is not an integer or out of range

decr例子

  1. #值不存在
  2. 127.0.0.1:> exists g
  3. (integer)
  4. 127.0.0.1:> incrby g
  5. (integer)
  6. 127.0.0.1:> incrby g
  7. (integer)
  8.  
  9. #值不是整数
  10. 127.0.0.1:> incrby name
  11. (error) ERR wrong number of arguments for 'incrby' command
  12.  
  13. #值是整数
  14. 127.0.0.1:> decr age
  15. (integer)
  16. 127.0.0.1:> incrby age
  17. (integer)
  18. 127.0.0.1:> incrby age
  19. (integer)

incrby例子

  1. #值不存在
  2. 127.0.0.1:> exists h
  3. (integer)
  4. 127.0.0.1:> decrby h
  5. (integer) -
  6.  
  7. #值不是整数
  8. 127.0.0.1:> decrby name
  9. (error) ERR wrong number of arguments for 'decrby' command
  10.  
  11. #值为整数
  12. 127.0.0.1:> decrby age
  13. (integer)
  14. 127.0.0.1:> decrby age
  15. (integer)

decrby例子

  1. #值不是整数
  2. 127.0.0.1:> incrbyfloat name 1.5
  3. (error) ERR value is not a valid float
  4.  
  5. #值是整数
  6. 127.0.0.1:> incrbyfloat age 2.5
  7. "28.5"
  8.  
  9. #值不存在
  10. 127.0.0.1:> incrbyfloat y 2.5
  11. "2.5"

incrbyfloat例子

注意:上面这些不同的类型指的增减数字的类型,例如是每次加1还是1.5

很多存储系统和编程语言内部都使用CAS机制实现技术功能,会有一定的CPU开销,但是在Redis中完全不存在这个问题

因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执行。

2.字符串不常用命令

1)追加值

命令:append key value

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

  1. 127.0.0.1:> get name
  2. "kebi"
  3. 127.0.0.1:> append name goods #追加
  4. (integer) #返回这个值的长度
  5. 127.0.0.1:> get name
  6. "kebigoods"

2)字符串长度

命令:strlen key

  1. 127.0.0.1:> get name
  2. "kebigoods" #一个字母一个字节
  3. 127.0.0.1:> strlen name
  4. (integer)

如果字符串是汉字,一个汉字占3个字节:

  1. 127.0.0.1:> set name:chinese "科比"
  2. OK
  3. 127.0.0.1:> strlen name:chinese
  4. (integer)

3)设置并返回原值

命令:get key value

getset和set一样能设置值,但不同的是,它会返回原值:

  1. 127.0.0.1:> getset name kebi-bryant
  2. "kebigoods"
  3. 127.0.0.1:> getset class seven
  4. (nil) #原值不存在返回空

4)设置指定位置的字符

命令:setrange key offeset values

  1. 127.0.0.1:> set drom
  2. OK
  3. 127.0.0.1:> setrange drom B #替换掉指定位置的字符,可以加
  4. (integer)
  5. 127.0.0.1:> get drom
  6. "301B"
  7. #注意外国人计数从0开始
  8. #替换之后中间有空格,用十六进制补
  9. 127.0.0.1:> set drom
  10. OK
  11. 127.0.0.1:> setrange drom B
  12. (integer)
  13. 127.0.0.1:> get redis
  14. (nil)
  15. 127.0.0.1:> get drom
  16. "301\x00B"

5)获取部分字符串

命令:getrange key start end

start和end分别是开始和结束的偏移量,偏移量从0开始计算

  1. 127.0.0.1:> get name
  2. "kebi-bryant"
  3. 127.0.0.1:> getrange name
  4. "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的理解和使用——字符串的命令的更多相关文章

  1. 2.API的理解和使用

    标题 : 2.API的理解和使用 目录 : Redis 序号 : 2 ​ zset的成员是唯一的,但分数(score)却可以重复. ​ 有序集合的内部编码 1.ziplist(压缩列表):当有序集合的 ...

  2. Linux常用命令学习2---(文件搜索命令locate find、命令搜索命令whereis which、字符串搜索命令grep、帮助命令man)

     1.文件搜索命令:locate [文件名]    在后台数据库中按文件名搜索,搜索速度比find快,耗费资源更少    例子:locate test.txt,就会显示文件名包含 test.txt的所 ...

  3. ES6之let(理解闭包)和const命令

    ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,E ...

  4. qnx:从API开始理解QNX -- 消息传递

    从API开始理解QNX -- 消息传递    http://www.openqnx.com/chinese/viewtopic.php?f=5&t=2161 1. 频道与连接    Chann ...

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

    Redis提供了5种数据结构,以下介绍一些预备知识以及Redis的5种数据结构 1.预备知识 1.1 全局命令 Redis的5种数据结构,它们是键值对中的值,对于键来说有一些通用的命令. (1)查看所 ...

  6. 在Linux中批量修改字符串的命令

    昨天一个朋友忽然问我,在Linux下如何批量修改字符串,当时瞬间懵逼了,完全想不起来....... 今天特意的重温了一下Linux下的一些常用命令,并将这个遗忘的批量修改字符串的命令记录下来(资料来自 ...

  7. 一篇文章助你理解Python3中字符串编码问题

    前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解 ...

  8. (九)Centos之搜索命令whereis、which和字符串搜索命令grep

    一.Centos之命令搜索命令whereis与which 1.1 whereis 命令名(搜索命令所在路径及帮助文档所在位置) 选项: -b :只查找可执行文件位置 -m:只查找帮助文件 1.2 wh ...

  9. API的理解和使用——列表类型的命令

    列表类型的命令及对应的时间复杂度 操作 命令 功能 时间复杂度 添加 rpush key value [value ...] 向右插入 O(k),k是元素个数 lpush key value [val ...

随机推荐

  1. [转] 使用SVN进行源码管理

    原文地址:gyzhao's, 使用SVN进行源码管理(下) 软件下载 1. Viusal SVN, Download(官网),安装该软件之前,请先安装TortoiseSVN,Download. 2. ...

  2. Android Studio +MAT 分析内存泄漏实战

    对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些已经不使用的对 ...

  3. git工程迁移(修改提交服务器地址)方法

    git remote set-url [--push] <name> <newurl> [<oldurl>]git remote set-url --add [-- ...

  4. MyBatis-Invalid bound statement (not found)-问题处理

    最近把工程改为Hibernate和MyBatis并存,并存只要注意两点即可: 1.使用同一个dataSource 2.事物交给Hibernate进行管理(Hibernate4+)  Hibernate ...

  5. hibernate oneToMany 缓存

    @OneToMany(mappedBy="carFieldType", cascade={CascadeType.ALL}, fetch = FetchType.EAGER)@Ca ...

  6. solor5.4学习笔记

    1.下载地址:http://archive.apache.org/dist/lucene/solr/ 2.与tomcat的整合http://jingyan.baidu.com/article/d807 ...

  7. (三)初识jQuery

    进入jQuery官网:http://jquery.com/ 点击Download jQuery v3.1.1--->下载最新版本的jQuery版本--->放到你需要引入jQuery的文件中 ...

  8. 应用处理器AP概述

    移动终端芯片其它部分见"一站式了解智能终端处理器". 功能机时代,扩展手机特性是在基带芯片上进行.手段包含:升级基带芯片获得更强的计算能力.电路进行又一次设计以添加功能如照相机和S ...

  9. 解决phpmyadmin导入大数据库出现一系列问题

    在用phpmyadmin导入mysql数据库文件时,往往超过2M就会提示文件大,导入不成功.这时我们打开phpmyadmin-->libraries-->config.default.ph ...

  10. jquery瀑布流布局插件,兼容ie6不支持下拉加载,用于制作分类卡

    调用方法 $('需要布局的块').sault() 如果要在图片加载后调用需要使用$(window).load(function(fx){});函数,即等待图片加载完成再调用 3个参数 1.left:左 ...