redis实战笔记(3)-第3章 Redis命令































WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。
以下示例展示了一个执行失败的事务例子:
redis> WATCH name
OK redis> MULTI
OK redis> SET name peter
QUEUED redis> EXEC
(nil)
以下执行序列展示了上面的例子是如何失败的:
| 时间 | 客户端 A | 客户端 B |
|---|---|---|
| T1 | WATCH name |
|
| T2 | MULTI |
|
| T3 | SET name peter |
|
| T4 | SET name john |
|
| T5 | EXEC |
在时间 T4 ,客户端 B 修改了 name 键的值, 当客户端 A 在 T5 执行 EXEC 时,Redis 会发现 name 这个被监视的键已经被修改, 因此客户端 A 的事务不会被执行,而是直接返回失败。
下文就来介绍 WATCH 的实现机制,并且看看事务系统是如何检查某个被监视的键是否被修改,从而保证事务的安全性的。



SETEX key seconds value
将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。
如果 key 已经存在, SETEX 命令将覆写旧值。 这个命令类似于以下两个命令:
SET key value
EXPIRE key seconds # 设置生存时间
不同之处是, SETEX 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
可用版本:>= 2.0.
返回值:
设置成功时返回 OK 。
当 seconds 参数不合法时,返回一个错误。
# 在 key 不存在时进行 SETEX redis> SETEX cache_user_id
OK
redis> GET cache_user_id # 值
""
redis> TTL cache_user_id # 剩余生存时间
(integer) # key 已经存在时,SETEX 覆盖旧值
redis> SET cd "timeless"
OK
redis> SETEX cd "goodbye my love"
OK
redis> GET cd
"goodbye my love"
redis> TTL cd
(integer)
SETNX key value
将 key 的值设为 value ,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 可用版本:>= 1.0.
返回值:
设置成功,返回 。
设置失败,返回 。
redis> EXISTS job # job 不存在
(integer)
redis> SETNX job "programmer" # job 设置成功
(integer)
redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败
(integer)
redis> GET job # 没有被覆盖
"programmer"
del,keys
LREM key count value 根据参数 count 的值,移除列表中与参数 value 相等的元素。 count 的值可以是以下几种:
count > : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = : 移除表中所有与 value 相等的值。
可用版本:
>= 1.0.
时间复杂度:
O(N), N 为列表的长度。
返回值:
被移除元素的数量。
因为不存在的 key 被视作空表(empty list),所以当 key 不存在时, LREM 命令总是返回 。 # 先创建一个表,内容排列是
# morning hello morning helllo morning redis> LPUSH greet "morning"
(integer)
redis> LPUSH greet "hello"
(integer)
redis> LPUSH greet "morning"
(integer)
redis> LPUSH greet "hello"
(integer)
redis> LPUSH greet "morning"
(integer) redis> LRANGE greet # 查看所有元素
) "morning"
) "hello"
) "morning"
) "hello"
) "morning" redis> LREM greet morning # 移除从表头到表尾,最先发现的两个 morning
(integer) # 两个元素被移除 redis> LLEN greet # 还剩 个元素
(integer) redis> LRANGE greet
) "hello"
) "hello"
) "morning" redis> LREM greet - morning # 移除从表尾到表头,第一个 morning
(integer) redis> LLEN greet # 剩下两个元素
(integer) redis> LRANGE greet
) "hello"
) "hello" redis> LREM greet hello # 移除表中所有 hello
(integer) # 两个 hello 被移除 redis> LLEN greet
(integer)
redis实战笔记(3)-第3章 Redis命令的更多相关文章
- Redis学习笔记(二)-key相关命令【转载】
转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...
- redis实战笔记(9)-第9章 降低内存占用
本章主要内容 1.短结构( short structure) 2.分片结构( shared structure) 3.打包存储二进制位和字节 本章将介绍3种非常有价值的降低Redis内存占用的 ...
- redis实战笔记(4)-第4章 数据安全与性能保障
本章主要内容 4.1 将数据持久化至硬盘 4.2 将数据复制至其他机器 4.3 处理系统故障 4.4 Redis事务 4.5 非事务型流水线( non-transactional pipeline) ...
- redis实战笔记(1)-第1章 初识Redis
第1章 初识Redis 注:本书在redis3.0版本的,比如redis3.0以后支持服务端集群.3.0之前只能客户端分片. 本章主要内容 1.Redis与其他软件的相同之处和不同之处 2.Re ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解
笔记 3.SpringBoot2.x整合redis实战讲解 简介:使用springboot-starter整合reids实战 1.官网:https://docs.spring.io/spring-bo ...
- Redis实战篇(一)搭建Redis实例
今天是Redis实战系列的第一讲,先从如何搭建一个Redis实例开始. 下面介绍如何在Docker.Windows.Linux下安装. Docker下安装 1.查看可用的 Redis 版本 访问 Re ...
- Redis实战-详细配置-优雅的使用Redis注解/RedisTemplate
1. 简介 当我们对redis的基本知识有一定的了解后,我们再通过实战的角度学习一下在SpringBoot环境下,如何优雅的使用redis. 我们通过使用SpringBoot内置的Redis注解(文章 ...
- Redis学习笔记(二)-key相关命令
Redis支持的各种数据类型包括string,list ,set ,sorted set 和hash . Redis本质上一个key-value db,所以我们首先来看看他的key.首先key也是字符 ...
- Redis学习笔记(一) 初识 Redis
简介 我所在的公司是一个以线下业务为主的公司,软件这一块的东西可以说是手工作坊,技术上的东西全靠大家自己折腾.最近也是觉得自己在社会主义的怀抱里安逸了太久,要提高思想政治觉悟,不能忘了资本主义的黑暗, ...
随机推荐
- Android-Java-Thread的使用
main线程跑三个任务: package android.java.thread2; class Demo { private String name; public Demo(String name ...
- C# 调用C++ CLR dll类库时,实现从 string 到 sbyte* 的转换
问题描述 今天在做项目的时候碰到一个问题,就是用C++编写CLR类库dll的时候,C++的函数参数列表中包含一个char*的输出型参数,然而在C#调用该dll时候,会自动将函数的中的char*参数“翻 ...
- python 查找字符串同时包含数字和字母的最长子字符串的几种实现方法
有个字符串$sd1#111$svda123!!!221&eSSDSDG,包含特殊字符.数字和字母,输出最长的子字符串和他的长度 例如上面的字符串同时包含数字和字母的字符串是svda123,长度 ...
- 设计模式之适配器模式(Adapter Pattern)
在正式开始之前,让我们先思考几个问题: 如果现有的新项目可以利用旧项目里大量的遗留代码,你打算从头开始完成新项目还是去了解旧项目的模块功能以及接口? 如果你了解过遗留代码之后,发现有几个重要的功能模块 ...
- JaveScript之CSS变量
大概是CSS3吧,出了一个叫CSS变量的东西,也叫自定义属性,还是比较有用的东东,可以用JavaScript灵活控制,变量作用 我们来实现一个div跟随鼠标滚动的小东西用来说明如何自定义变量 :roo ...
- 使用Spring Boot,Spring Cloud和Docker实现微服务架构
https://github.com/sqshq/PiggyMetrics Microservice Architecture with Spring Boot, Spring Cloud a ...
- 【转】目标检测之YOLO系列详解
本文逐步介绍YOLO v1~v3的设计历程. YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这 ...
- Ultra-QuickSort (POJ 2299)树状数组+离散化
题目链接 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm ...
- 基于SWOOLE的分布式SOCKET消息服务器架构
消息服务器使用socket,为避免服务器过载,单台只允许500个socket连接,当一台不够的时候,扩充消息服务器是必然,问题来了,如何让链接在不同消息服务器上的用户可以实现消息发送呢? 要实现消息互 ...
- webpack快速入门——CSS分离与图片路径处理
1.在终端安装extract-text-webpack-plugin 2.引入插件 const extractTextPlugin = require("extract-text-webpa ...