Redis String 类型和 Hash 类型学习笔记与总结

Linux 版本信息:

代码如下:

cat /etc/issue  或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息)

CentOS release 6.6 (Final)

(一)String 类型

【定义】string 是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个 value,其上支持的操作与 Memcached 的操作类似。但它的功能更丰富。

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据, 比如 jpg 图片或者序 列化的对象。 从内部实现来看其实 string 可以看作 byte 数组,最大上限是 1G 字节。

【操作】

① set 方法

设置 key 对应的值为 string 类型的 value。

【例】添加 name = dee 的键值对:

代码如下:

127.0.0.1:6379> set name dee
OK

设置成功。

② get 方法

【例】

代码如下:

127.0.0.1:6379> get name
"dee"

获取成功。

再次设置 name = deathmask,值会被覆盖:

代码如下:

127.0.0.1:6379> set name deathmask
OK

127.0.0.1:6379> get name
"deathmask"

③ setnx 方法

设置 key 对应的值为 string 类型的 value,如果 key 已经存在,返回 0,nx 表示 not exist。

【例】

代码如下:

127.0.0.1:6379> setnx name dee
(integer) 0

127.0.0.1:6379> setnx app weibo
(integer) 1

127.0.0.1:6379> get name
"deathmask"

127.0.0.1:6379> get app
"weibo"

表示 name 已经存在而且没有更改,app 不存在则成功 set。

④ setex 方法

设置 key 对应的值为 string 类型的 value,并指定  此键值 对应的有效期。

【例】

代码如下:

127.0.0.1:6379> setex mobile 10 iphone
OK

127.0.0.1:6379> get mobile
"iphone"

127.0.0.1:6379> get mobile
"iphone"

127.0.0.1:6379> get mobile
(nil)

设置 mobile 的值为 iPhone,并且指定有效期为 10 秒。

⑤ setrange 方法

设定指定 key 的 value 值的子字符串

【例】将 dee 的 126 邮箱 替换为 gmail 邮箱

代码如下:

127.0.0.1:6379> set email dee@126.com
OK

127.0.0.1:6379> get email
"dee@126.com"

127.0.0.1:6379> setrange email 4 gmail.com
(integer) 13

127.0.0.1:6379> get email
"dee@gmail.com"

其中 4 代表下标,(integer) 13 表示字符串的长度。

【例2】

代码如下:

127.0.0.1:6379> set email dee@vip.ofim.com
OK

127.0.0.1:6379> get email
"dee@vip.ofim.com"

127.0.0.1:6379> setrange email 4 gmail.com
(integer) 16

127.0.0.1:6379> get email
"dee@gmail.comcom"

说明:如果替换的字符串没有源字符串长,则只会把源字符串中相同长度的字符替换掉,同时保留源字符串中剩余的字符。

⑥ mset 方法

一次设置多个 key 值,成功返回 ok,表示所有的值都设置了,失败返回 0,表示没有任何值被设置。

【例】

代码如下:

127.0.0.1:6379> mset key1 dee1 key2 dee2
OK

127.0.0.1:6379> get key1
"dee1"

127.0.0.1:6379> get key2
"dee2"

⑦ msetnx 方法

一次设置多个 key 的值,成功返回 1,表示所有的值都被设置了。失败返回 0 ,表示没有任何值被设置,但是不会覆盖已经存在的 key。

代码如下:

127.0.0.1:6379> msetnx key3 dee3 key4 dee4
(integer) 1

127.0.0.1:6379> msetnx key3 dee333 key4 dee444 key5 dee5
(integer) 0

127.0.0.1:6379> get key3
"dee3"

127.0.0.1:6379> get key4
"dee4"

127.0.0.1:6379> get key5
(nil)

⑧ getset 方法

设置 key 的值,并返回 key 的旧值。

【例】

代码如下:

127.0.0.1:6379> getset key1 emperor
"dee1"

⑨ getrange 方法

获取 key 的 value 值的子字符串。

代码如下:

127.0.0.1:6379> get email
"dee@gmail.comcom"

127.0.0.1:6379> getrange email 0 12
"dee@gmail.com"

返回第 0 到第12 个字符。
⑩ mget 方法

一次获取多个 key 的值,如果对应 key 不存在则对应返回 nil。

【例】

代码如下:

127.0.0.1:6379> mget key1 key2 key3 key4 key5
1) "emperor"
2) "dee2"
3) "dee3"
4) "dee4"
5) (nil)

⑪ incr 方法
对 key 的值做 加加 操作,并返回新的值。

【例】每次递增1

代码如下:

127.0.0.1:6379> set age 28
OK

127.0.0.1:6379> get age
"28"

127.0.0.1:6379> incr age
(integer) 29

127.0.0.1:6379> incr age
(integer) 30

127.0.0.1:6379> get age
"30"

【例2】

代码如下:

127.0.0.1:6379> get real-age
(nil)

127.0.0.1:6379> incr real-age
(integer) 1

127.0.0.1:6379> get real-age
"1"

⑫ incrby 方法

同 incr 方法类似,加指定值,key 不存在时会设置 key,并认为原来的 value 为 0。

【例】

代码如下:

127.0.0.1:6379> get times
(nil)

127.0.0.1:6379> incrby times 5
(integer) 5

127.0.0.1:6379> get times
"5"

【例2】

代码如下:

127.0.0.1:6379> incrby times -5
(integer) 0

127.0.0.1:6379> get times
"0"

⑬ decr 方法

对 key 的值做 减减操作。

⑭ decrby 方法

同 decr 方法类似,减指定值。

【例】

代码如下:

127.0.0.1:6379> get age
"30"

127.0.0.1:6379> decr age
(integer) 29

127.0.0.1:6379> decrby age 10
(integer) 19

127.0.0.1:6379> decrby age -10
(integer) 29

⑮ append 方法(重要)

给指定 key 的字符串追加 value ,返回新字符串的长度。

【例】

代码如下:

127.0.0.1:6379> get name
"deathmask"

127.0.0.1:6379> append name @163.com
(integer) 17

127.0.0.1:6379> get name
"deathmask@163.com"

⑯ strlen 方法

取指定 key 的 value 值的长度。

【例】

代码如下:

127.0.0.1:6379> get name
"deathmask@163.com"

127.0.0.1:6379> strlen name
(integer) 17

(二)Hash 类型

Redis hash 是一个 string 类型的 field 和 value 的 映射表。它的添加、删除操作都是 0(1)(平均操作)。

hash 特别 适合用于存储对象。相较于将对象的每个字段存成单个 string 类型(string 类型可以存储对象序列化)。

将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。

(省内存的原因是新建一个 hash 对象时开始是用 zipmap(又称为 small hash)来存储的。

这个 zipmap 其实并不是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据存储开销。

尽管 zipmap 的添加,删除,查找都是 O(n),但是由于一般对象的 field 数量都不太多,所以使用 zipmap 也是很快的,也就是说添加删除平均还是 O(1)。

如果 field 或者 value的大小超出一定限制后, Redis 会在内部自动将 zipmap 替换成正常的 hash 实现. 这个限制可以在配置文件中指定。

hash-max-zipmap-entries 64 #配置字段最多 64 个,hash-max-zipmap-value 512 #配置 value 最大为 512 字节)

【操作】

① hset 方法 / hget 方法

设置hash field 为指定值,如果 key 不存在,则先创建。

【例】

代码如下:

127.0.0.1:6379> hset myhash field1 hello
(integer) 1

说明:myhash 是 hash 表的名称,field1 是 hash 表的一个字段,hello 是这个字段对应的值。存储用户比较方便。

【例2】

代码如下:

127.0.0.1:6379> hset user:001 name dee
(integer) 1

127.0.0.1:6379> hget user:001 name
"dee"

说明:设置 user 表 id 为 001 的用户,用户名为 dee。

可以把 user:001 看作一张表。

② hsetnx 方法

设置 hash field 为指定值,如果 key 不存在,则先创建;如果存在,则返回 0。

【例】

代码如下:

127.0.0.1:6379> hsetnx myhash field "hello"
(integer) 1

127.0.0.1:6379> hsetnx myhash field "hello!"
(integer) 0

127.0.0.1:6379> hget myhash field
"hello"

③ hmset 方法

同时设置 hash 的多个 field

【例】

代码如下:

127.0.0.1:6379> hmset user:002 name dee specialty php
OK

127.0.0.1:6379> hget user:002 name
"dee"

127.0.0.1:6379> hget user:002 specialty
"php"

④ hget 方法

获取全部指定的 hash field。

【例】

代码如下:

127.0.0.1:6379> hmget user:002 name specialty
1) "dee"
2) "php"

⑤ hincrby 方法

指定的 hash field 加上给定值。

【例】

代码如下:

127.0.0.1:6379> hmset user:002 name dee specialty redis age 28
OK

127.0.0.1:6379> hincrby user:002 age -6
(integer) 22

127.0.0.1:6379> hmget user:002 name specialty age
1) "dee"
2) "redis"
3) "22"

127.0.0.1:6379> hincrby user:002 age 5
(integer) 27

127.0.0.1:6379> hmget user:002 name specialty age
1) "dee"
2) "redis"
3) "27"

⑥ hexists 方法

测试指定 field 是否存在。

【例】

代码如下:

127.0.0.1:6379> hexists user:002 name
(integer) 1

127.0.0.1:6379> hexists user:002 sex
(integer) 0

⑦ hlen 方法

返回指定 hash 的 field 数量。

【例】

代码如下:

127.0.0.1:6379> hlen user:002
(integer) 3

⑧ hdel 方法

删除指定 hash 的 field。

【例】

代码如下:

127.0.0.1:6379> hdel user:002 age
(integer) 1

127.0.0.1:6379> hget user:002 age
(nil)

⑨ hkeys 方法(类似 PHP 中 array_keys() 方法)

返回 hash 的所有 field。

【例】

代码如下:

127.0.0.1:6379> hkeys user:002
1) "name"
2) "specialty"

⑩ hvals 方法(类似 PHP 中的 array_values() 方法)

返回 hash 的所有 value。

【例】

代码如下:

127.0.0.1:6379> hvals user:002
1) "dee"
2) "redis"

⑪ hgetall 方法

获取某个 hash 中全部的 field 及 value。

【例】

代码如下:

127.0.0.1:6379> hgetall user:002
1) "name"
2) "dee"
3) "specialty"
4) "redis"

【总结】设置 hash 类型的数据,首先要设置 hash 的表,然后设置 hash 的 field,最后设置 hash field 的 value。

(0)

相关推荐

  • Redis教程(二):String数据类型

    一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的Value最多可以容纳的数据长度是512M. 二.相关命令列表: 命令原型 时间复杂度 命令描述 返回值 APPENDkeyvalue O(1) 如果该Key已经存在,APPEND命令将参数Value的数据追加到已存在Value的末尾.如果该Key不存在,APPEND命令将会创建一个新的Key/V

  • Redis02 使用Redis数据库(String类型)全面解析

    一 String类型 首先使用启动服务器进程 : redis-server.exe 1. Set 设置Key对应的值为String 类型的value. 例子:向 Redis数据库中插入一条数据类型为String 的记录. 在客户端输入命令: C:\software\redis\64bit>redis-cli.exe -h 127.0.0.1 -p 6379 redis 127.0.0.1:6379> set foo test OK redis 127.0.0.1:6379> get fo

  • Redis String 类型和 Hash 类型学习笔记与总结

    Linux 版本信息: 复制代码 代码如下: cat /etc/issue  或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息) CentOS release 6.6 (Final) (一)String 类型 [定义]string 是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个 value,其上支持的操作与 Memcached 的操作类似.但它的功能更丰富. string 类型是二进制安全的.意思是 redi

  • C++ Primer Plus 第四章之C++ Primer Plus复合类型学习笔记

    目录 1. 数组概述 1.1 数组的定义 1.2 数组的声明 1.3 复合类型的数组 1.4 数组的初始化规则 1.5 C++11数组初始化方法 2. 字符串 2.1 C++处理字符串的两种方式: 2.2 字符串常量的拼接 2.4 读取一行字符串的输入 3. string类 3.1 string对象的方式 3.2 复制.拼接和附加 4. 结构简介 4.1 创建结构的步骤: 4.2 结构的定义: 4.3 结构的初始化(C++11) 4.4 成员赋值 5. 共用体 5.1 结构体和共用体的区别 5.

  • 详解Go中Map类型和Slice类型的传递

    关于 Go 中 Map 类型和 Slice 类型的传递 Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) { m[1] = 100 m[2] = 200 } 结果是 map[2:200 1:100] 我们再修改如下 m2: func main() { var m map[int]int mdMap(m) fmt.Println(m) }

  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) { m[1] = 100 m[2] = 200 } 结果是 map[2:200 1:100] 我们再修改如下 m2: func main() { var m map[int]int mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) {

  • C#实现String类型和json之间的相互转换功能示例

    本文实例讲述了C#实现String类型和json之间的相互转换功能.分享给大家供大家参考,具体如下: ////Donet2.0 需要添加引用 // 从一个对象信息生成Json串 public static string ObjectToJson(object obj) { return JavaScriptConvert.SerializeObject(obj); } // 从一个Json串生成对象信息 public static object JsonToObject(string jsonS

  • Java语言Consistent Hash算法学习笔记(代码示例)

    本文研究的主要是ConsistentHashing算法代码. 一致性哈希(Consistent Hash) 协议简介 一致性哈希算法在1997年由麻省理工学院提出(参见0),设计目标是为了解决因特网中的热点(Hot pot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用. 哈希算法 一致性哈希提出了在动态变化的Cache环境中,哈希算法应该满足的4个适应条件: 平衡性(Balance) 平衡性是指哈希的结果能够尽可能分

  • Python3中的bytes类型和str类型

    目录 前言: 编码发展的历史 bytes和str之间的异同 前言: Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和bytes,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然). 下面让我们深入分析一下二者的区别和联系. 编码发展的历史 在谈bytes和str之前,需要先说说关于编码

  • Redis list 类型学习笔记与总结

    redis 版本 复制代码 代码如下: [root@localhost ~]# redis-server --version Redis server v=2.8.19 sha=00000000:0 malloc=jemalloc-3.6.0 bits=32 build=e2559761bd460ca0 list 是一个链表结构,主要功能是 push(类似 PHP 的 array_push() 方法). pop(类似 PHP 的 array_pop() 方法).获取一个范围的所有值 等, 操作

  • MVC使用T4模板生成其他类的具体实现学习笔记2

    在前篇中我们已经将User类中的代码做了具体的实现,但仍然有多个实体类未实现,以后可能还会增加新的数据表,数据表结构也有可能发生变化,所以我们使用T4模板来完成类的生成,这样就算数据库表发生了改变,也会自动根据改变后的实体对类进行重新生成. 下面是数据访问层的T4模板文件 Dal.tt <#@ template language="C#" debug="false" hostspecific="true"#> <#@ inclu

  • Swift中内置的集合类型学习笔记

    一.引言 Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型.Array用于存放一组有序的数据,数据角标从0开始一次递增:Set用于存放一组无序的数据,数据不可以重复:Dictionary也用于存放一组无序的数据,只是其是按照键值对的方式存储,键值必须唯一.这里借用官方文档中的一张图来表示3种集合类型的特点: 二.Array类型 Array通常也被称为数组,Swift是一种类型安全语言,其中的Array类型也必须确定其元素的类型,声明数组类型有两种方

随机推荐