C#Redis字符串
上周六通宵打牌周日白天只睡3小时累成狗,从今天起以后不能玩太大的了,小赌怡情大赌伤身,和同事朋友有空玩玩还是好的。今天公司外面马路上有人挂灯笼时死了一个人,哎,快过年了悲剧又发生了,真是生命是脆弱的。虽然这一两个月贪玩了点,但技术也不能落下,周一到周五下班没事的话有时候也会上网大致了解一些。今天就接着之前的博客继续开始redis之路。
至于什么是redis,它是用来做什么的?它的用处有好多,这里我也不一一列举,以后也会有说明,写redis主要是需求驱动,渐进式的学习,因为前面学习了nginx,导致会有多个地方部署程序,那这样如果用户在A登录了,可能再次访问时又会访问B,但这样B可能会判断同一个用户没有登录,既然对用户透明,这样多次登录也是不好的,而redis就可以解决这个问题。还有我们登录app或下单什么的,经常会收到验证码什么的,有效期有的是120s或60s,虽然用数据库也能实现这样的功能,这样的话就要连接数据库做一系列的逻辑验证,如果用redis就会很简单。这些都是redis的用处。redis有五大数据类型,从今天开始以此学习这几种数据类型。今天就先学习字符串类型。首先说明redis这一系列博客我也是参照别人的博客,然后自己动手敲的,地址http://www.cnblogs.com/stephen-liu74/archive/2012/04/16/2370212.html的内容是学习五大类型主要模仿的对象,大家可以看上面地址的博客。
一、前戏
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
二、理论
命令原型 |
时间复杂度 | 命令描述 | 返回值 |
APPEND key value | O(1) | 如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾。如果该Key不存在,APPEND命令将会创建一个新的Key/Value。 | 追加后Value的长度。 |
DECR key | O(1) | 将指定Key的Value原子性的递减1。如果该Key不存在,其初始值为0,在decr之后其值为-1。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。 | 递减后的Value值。 |
INCR key | O(1) | 将指定Key的Value原子性的递增1。如果该Key不存在,其初始值为0,在incr之后其值为1。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。 | 递增后的Value值。 |
DECRBY key decrement | O(1) | 将指定Key的Value原子性的减少decrement。如果该Key不存在,其初始值为0,在decrby之后其值为-decrement。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。 | 减少后的Value值。 |
INCRBY key increment | O(1) | 将指定Key的Value原子性的增加increment。如果该Key不存在,其初始值为0,在incrby之后其值为increment。如果Value的值不能转换为整型值,如Hello,该操作将执行失败并返回相应的错误信息。注意:该操作的取值范围是64位有符号整型。 | 增加后的Value值。 |
GET key | O(1) | 获取指定Key的Value。如果与该Key关联的Value不是string类型,Redis将返回错误信息,因为GET命令只能用于获取string Value。 | 与该Key相关的Value,如果该Key不存在,返回nil。 |
SET key value | O(1) | 设定该Key持有指定的字符串Value,如果该Key已经存在,则覆盖其原有值。 | 总是返回"OK"。 |
GETSET key value | O(1) | 原子性的设置该Key为指定的Value,同时返回该Key的原有值。和GET命令一样,该命令也只能处理string Value,否则Redis将给出相关的错误信息。 | 返回该Key的原有值,如果该Key之前并不存在,则返回nil。 |
STRLEN key | O(1) | 返回指定Key的字符值长度,如果Value不是string类型,Redis将执行失败并给出相关的错误信息。 | 返回指定Key的Value字符长度,如果该Key不存在,返回0。 |
SETEX key seconds value | O(1) | 原子性完成两个操作,一是设置该Key的值为指定字符串,同时设置该Key在Redis服务器中的存活时间(秒数)。该命令主要应用于Redis被当做Cache服务器使用时。 | #通过ttl命令查看一下指定Key的剩余存活时间(秒数),0表示已经过期,-1表示永不过期.在Redis 2.8以后,当key不存在时,返回-2。 |
SETNX key value | O(1) | 如果指定的Key不存在,则设定该Key持有指定字符串Value,此时其效果等价于SET命令。相反,如果该Key已经存在,该命令将不做任何操作并返回。 | 1表示设置成功,否则0。 |
SETRANGE key offset value | O(1) | 替换指定Key的部分字符串值。从offset开始,替换的长度为该命令第三个参数value的字符串长度,其中如果offset的值大于该Key的原有值Value的字符串长度,Redis将会在Value的后面补齐(offset - strlen(value))数量的0x00,之后再追加新值。如果该键不存在,该命令会将其原值的长度假设为0,并在其后添补offset个0x00后再追加新值。鉴于字符串Value的最大长度为512M,因此offset的最大值为536870911。最后需要注意的是,如果该命令在执行时致使指定Key的原有值长度增加,这将会导致Redis重新分配足够的内存以容纳替换后的全部字符串,因此就会带来一定的性能折损。 | 修改后的字符串Value长度。 |
GETRANGE key start end | O(1) | 如果截取的字符串长度很短,我们可以该命令的时间复杂度视为O(1),否则就是O(N),这里N表示截取的子字符串长度。该命令在截取子字符串时,将以闭区间的方式同时包含start(0表示第一个字符)和end所在的字符,如果end值超过Value的字符长度,该命令将只是截取从start开始之后所有的字符数据。 | 子字符串 |
SETBIT key offset value | O(1) | 设置在指定Offset上BIT的值,该值只能为1或0,在设定后该命令返回该Offset上原有的BIT值。如果指定Key不存在,该命令将创建一个新值,并在指定的Offset上设定参数中的BIT值。如果Offset大于Value的字符长度,Redis将拉长Value值并在指定Offset上设置参数中的BIT值,中间添加的BIT值为0。最后需要说明的是Offset值必须大于0。 | 在指定Offset上的BIT原有值。 |
GETBIT key offset | O(1) | 返回在指定Offset上BIT的值,0或1。如果Offset超过string value的长度,该命令将返回0,所以对于空字符串始终返回0。 | 在指定Offset上的BIT值。 |
MGET key [key ...] | O(N) | N表示获取Key的数量。返回所有指定Keys的Values,如果其中某个Key不存在,或者其值不为string类型,该Key的Value将返回nil。 | 返回一组指定Keys的Values的列表。 |
MSET key value [key value ...] | O(N) | N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SET命令。 | 该命令不会失败,始终返回OK。 |
MSETNX key value [key value ...] | O(N) | N表示指定Key的数量。该命令原子性的完成参数中所有key/value的设置操作,其具体行为可以看成是多次迭代执行SETNX命令。然而这里需要明确说明的是,如果在这一批Keys中有任意一个Key已经存在了,那么该操作将全部回滚,即所有的修改都不会生效。 | 1表示所有Keys都设置成功,0则表示没有任何Key被修改。 |
三、实操
127.0.0.1:> append mykey helloworld
(integer)
127.0.0.1:> get mykey
"helloworld"
127.0.0.1:> set mykey
OK
127.0.0.1:> decr mykey
(integer)
127.0.0.1:> incr mykey
(integer)
127.0.0.1:> decrby mykey -
(integer)
127.0.0.1:> incrby mykey -
(integer)
127.0.0.1:> strlen mykey
(integer)
127.0.0.1:> setex mykey ***
OK
127.0.0.1:> ttl mykey
(integer)
127.0.0.1:> ttl mykey
(integer)
127.0.0.1:> ttl mykey
(integer)
127.0.0.1:> ttl mykey
(integer) -
127.0.0.1:> setnx mykey
(integer)
127.0.0.1:> get mykey
""
127.0.0.1:> setnx mykey
(integer)
127.0.0.1:> get mykey
""
127.0.0.1:> setrange mykey
(integer)
127.0.0.1:> get mykey
""
127.0.0.1:> setrange mykey
(integer)
127.0.0.1:> get mykey
""
127.0.0.1:> setrange mykey
(integer)
127.0.0.1:> get mykey
"1234\x00\x003"
127.0.0.1:> getrange mykey
"4\x00"
127.0.0.1:> getrange mykey
""
127.0.0.1:> del mykey
(integer)
127.0.0.1:> get mykey
(nil)
127.0.0.1:> setbit mykey
(integer)
127.0.0.1:> get mykey
"\x01"
127.0.0.1:> set mykey
(error) ERR syntax error
127.0.0.1:> setbit mykey
(integer)
127.0.0.1:> get mykey
"\x03"
127.0.0.1:> getbit mykey
(integer)
127.0.0.1:> getbit mykey
(integer)
127.0.0.1:> del mykey
(integer)
127.0.0.1:> get mykey
(nil)
127.0.0.1:> mset mykey a mykey1 b
OK
127.0.0.1:> mget mykey mykey1
) "a"
) "b"
127.0.0.1:> msetnx mykey2 c mykey3 d
(integer)
127.0.0.1:> mget mykey mykey1 mykey2 mykey3
) "a"
) "b"
) "c"
) "d"
127.0.0.1:> msetnx mykey e mykey4 f
(integer)
127.0.0.1:> mget mykey mykey4
) "a"
) (nil)
127.0.0.1:>
C#Redis字符串的更多相关文章
- redis字符串
字符串类型是redis的基本类型 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:COMMAND KEY_NAME SET 和GET用于设置和读取key的值 1.SET key ...
- Redis 字符串(String)
Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 实例 redis 12 ...
- 2016022608 - redis字符串命令集合
redis字符串命令: Redis字符串命令用于在Redis管理字符串值.使用Redis字符串命令的语法如下所示: redis 127.0.0.1:6379> COMMAND KEY_NAME ...
- redis 字符串
redis 字符串 概述 redis 没有使用 c 语言风格的字符串表示(以 "\0" 作为结尾), 而是使用自定义的 sds 结构 字符串结构 定义位置 (src/sds.h) ...
- redis 字符串的管理的一点理解
redis字符串可以实现通过地址偏移找到所在结构体的首地址,struct sdshdr *sh = (void *)(s - (sizeof(struct sdshdr))) 也就是通过buf地址可以 ...
- Python操作redis字符串(String)详解 (三)
# -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1.SET 命令用于设置 ...
- Redis 字符串(String)
Redis 字符串(String) Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_ ...
- redis字符串基本操作
redis之字符串类型: 字符串类型是redis中最基本的数据类型,同时它也是memcached中仅有的数据类型.redis字符串类型的键能存储任何形式的字符串,包括二进制数据,例如,存储json化的 ...
- Redis字符串(STRING)中BIT相关命令
上篇文章我们对STRING数据类型中一些基本的命令进行了介绍,但是没有涉及到BIT相关的命令,本文我们就来看看几个和BIT相关的命令. 本文是Redis系列的第四篇文章,了解前面的文章有助于更好的理解 ...
- Redis字符串键的底层原理
before C语言基础 Redis基础 导入 redis的命令如下: set x "hello"; get x; hello Redis作为一种存储字符串的缓存结构,其具体实现是 ...
随机推荐
- datagridcolumn单元格怎么显示查询到的某个表的字段值(字段值可能为多个)
例如,在之前做的项目中,查询mhz_xckcr表,select出某个业务的现场勘察人信息,select出的现场勘察人姓名(可能有多个)要在前台datagrid的一个datagridcolmn单元格显示 ...
- AngularJs ng-repeat
AngularJs ng-repeat 必须注意的性能问题 AngularJs 的 ng-repeat 让我们非常方便的遍历数组生成 Dom 元素,但是使用不当也会有性能问题. 在项目中我们使用 ng ...
- Nexus入门指南(图文)
Nexus入门指南(图文) 博客分类: Maven JavamavenGoogleApacheTomcat Nexus介绍 Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven ...
- ThoughtWorks开发持续集成及部署利器:Go
持续集成及部署利器:Go Go是一款先进的持续集成和发布管理系统,由ThoughtWorks开发.(不要和Google的编程语言Go混淆了!)其前身为Cruise,是ThoughtWorks在做咨 ...
- 认识CLR [《CLR via C#》读书笔记]
认识CLR [<CLR via C#>读书笔记] <CLR via C#>读书笔记 什么是CLR CLR的基本概念 通用语言运行平台(Common Language Runti ...
- Leetcode::JumpGame
Description: Given an array of non-negative integers, you are initially positioned at the first inde ...
- 哞哞快的 C# 高斯模糊实现(续)
昨天刚写了<哞哞快的 C# 高斯模糊实现>,里边提到了用原作者的方法实现对图像快速的高斯模糊处理,说实话,我没看懂,主要是没看懂原理,怎么就“把图片给处理了”,大概是调用了 GDIPlus ...
- C++数据结构之二叉查找树(BST)
C++数据结构之二叉查找树(BST) 二分查找法在算法家族大类中属于“分治法”,二分查找的过程比较简单,代码见我的另一篇日志,戳这里!因二分查找所涉及的有序表是一个向量,若有插入和删除结点的操作,则维 ...
- JS二维数据处理逻辑封装探究
一.目的 定义出一个专门用于处理二维数据的组件,所谓二维数据就是能用二维表格显示出来的数据,所谓处理就是增删改查,很简单. 二.约束 外部程序给该组件传入如下形式的对象,让该组件自行解析. var t ...
- Jquery EasyUI tabs处理
一 获取选中的 Tab 1. // 获取选中的 tab panel 和它的 tab 对象 2. var pp = $('#tt').tabs('getSelected'); 3. var ta ...