- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
**摘要:**Redis中有五大数据类型,分别是String、List、Set、Hash和Zset。
本文分享自华为云社区《Redis的string类型常用命令解析》,作者:灰小猿 。
先问大家一个问题:你知道Java的数据类型有哪些吗?很多小伙伴肯定会直接想到int、byte、string等等~~~但是如果这样回答就错啦!
Java中的数据类型包括:基本数据类型和引用数据类型,其中基本数据类型包括:byte、short、int、long、double、float、char、boolean八种,而引用数据类型则是另外三种,分别是类、接口和数组!注意是没有string类型的,这可是面试的一个坑哈!
而在Redis中也是有数据类型的,和Java中有所不同,在Redis中有五大数据类型,分别是String、List、Set、Hash和Zset。而这五种数据类型中的每一个,都对应着很多不同的使用场景。接下来我们就先来学习一下在Redis中操作string和Hash字符串的命令有哪些?
String类型是在Redis中最常用的数据类型,它也是很多程序员在日常开发中最常使用甚至只会用的数据类型,这也就导致很多人在使用Redis的时候,就只知道使用string类型,而忽视了其他数据类型的重要性。所以我也希望大家在学习完这篇文章之后,对Redis中的数据类型有一个新的认识,不要只使用String类型进行Redis的操作啦!
**注意:**在Redis的客户端中进行操作之前,一定要保证Redis的服务器界面处于开启状态,否则会出现客户端拒绝访问或打不开的情况哈!
Redis中给string类型的数据设置指定key的方法就是最基本的设置key-value的方法,
语法如下:
SET key value
key为索引
value为对应的值
例如我们要设置索引为k3,值为v3的键值对数据
127.0.0.1:6379> SET k3 v3
OK
返回值为ok,则说明设置成功!
获取指定key的值
如果我们已经在Redis中设置了数据,那么我们可以通过该数据的key来获取它,语法格式如下:
GET key
key为要获取的值对应的索引
例如我们获取刚才输入的索引为k3,值为v3的数据,如果该索引存在,那么将会返回对应的值,如果不存在就会返回(nil)也就是null的意思。
127.0.0.1:6379> GET k3
"v3"
127.0.0.1:6379> GET k4
(nil)
这个命令的作用是获取Redis中已经存在的字符串的子串,同时我们可以指定一个下标索引,指定要获取哪一段字符。命令的格式如下:
GETRANGE key start end
key为字符串的索引
start为截取的起始下标
end为截取的终止下标
比如我们截取索引为“mykey”,值为“huixiaoyuan”的数据的子串,
127.0.0.1:6379> GETRANGE mykey 2 5
"ixia"
127.0.0.1:6379> GETRANGE mykey 2 -1
"ixiaoyuan"
127.0.0.1:6379> GETRANGE mykey 1 100
"uixiaoyuan"
讲解一下上面的代码,因为字符串的起始下标是0,所以第2个对应的字符是“i”,如果想要截取字符串从某一个字符到最后部分的子串,那么可以直接将最后一个参数设置为-1.
如果你设置的获取子串的范围比较大,已经超出了字符串原本的长度,那么只会返回到字符串的最后一个字符!
与GET命令不同,GET命令只能获取一个key对应的值,而这个命令可以用于获取多个key对应的值,格式如下:
MGET key1 [key2...]
在MGET的后面可以追加多个索引,以空格分开
如我们来获取一下mykey、mykey1、mykey2分别对应的值,
127.0.0.1:6379> MGET mykey mykey1 mykey2
1) "huixiaoyuan"
2) "value1"
3) "value2"
这个命令的作用是获取到当前索引对应的字符串的长度,格式如下:
STRLEN key
key为字符串对应的索引
127.0.0.1:6379> STRLEN mykey
(integer) 11
我们知道SET命令的作用是设置一个键值对,但是如果有多个键值对同时设置呢?这个时候就可以使用这个命令了,格式如下:
MSET key1 value1 [key2 value2 ...]
key1 value1为要设置的第一个键值对,之后的以空格分隔
如下我们设置同时设置三个键值对
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
和上面这个命令相对的还有一个,该命令仅能在key不存在的情况下才能设置,否则所有的key-value都将会赋值失败,格式如下:
MSETNX key1 value1 [key2 value2 ...]
key1 value1为要设置的第一个键值对,之后的以空格分隔
如我们给已经存在的k4设置值,那么返回0,说明设置失败,如果设置成功,则会返回1
127.0.0.1:6379> MSETNX k1 v1 k4 v4
(integer) 0
127.0.0.1:6379> MSETNX k4 v4 k5 v5
(integer) 1
这个命令可以将我们存储的字符的值加1,之后返回相加后的结果,但是如果该key对应的字符不是一个数的话,就会返回一个错误信息,格式如下:
INCR key
key为要加1的数对应的索引
如下我们给刚才设置的k8加1,那么就会报错,重新设置一个数值的键值对,再进行加1,就可以返回对应的数据
127.0.0.1:6379> INCR k8
(error) ERR value is not an integer or out of range
127.0.0.1:6379> SET num1 10
OK
127.0.0.1:6379> INCR num1
(integer) 11
与INCR 命令对应的还有一个INCRBY 该命令可以给指定的key对应的数据加上指定的增量,格式如下:
INCRBY key increment
key为索引
increment为要增加的值
127.0.0.1:6379> INCRBY num1 5
(integer) 16
既然存在增加的操作,那么对应着也就是存在减少的操作,格式如下:
DECR key
key为要加1的数对应的索引
上一步我们将num1对应的数值加5后得到16,现在我们对其进行减一操作。
127.0.0.1:6379> DECR num1
(integer) 15
与这个命令对应的还有减指定的数据的命令,格式如下:
DECRBY key increment
key为索引
decrement为要增加的值
127.0.0.1:6379> DECRBY num1 2
(integer) 13
如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。返回的是追加后的长度,格式如下:
APPEND key value
key为索引
value为要追加的字符串
如我们在mykey1-value1的后面追加“hello”
127.0.0.1:6379> APPEND mykey1 hello
(integer) 11
127.0.0.1:6379> GET mykey1
"value1hello"
Hash类型是一个String类型的field(字段)和value(值)的映射表,它的作用是可以用来存储我们定义的数据对象,所以简单来说它是一个key下面存储了多个key-value的情况,给大家简单的话一个Hash的结构图:
接下来我们来简单讲一下在Redis中对于Hash这种数据类型,常用的几个命令,
设置Hash数据所使用的命令不是SET,而是HMSET,你可以理解为H代表Hash的意思,M代表Map的意思,该命令的格式如下:
HMSET key fieId1 value1 [fieId2 value2…]
如我们设置key为“myhash”,里面存储的field分别为name-huixiaoyuan、sex-nan、age-3的三个键值对
127.0.0.1:6379> HMSET myhash name huixiaoyuan sex nan age 3
OK
查看指定哈希表中所有的字段和值的命令是HGETALL,作用是取出该hash中所有的数据,格式如下
HGETALL key
如我们查看刚才设置的hash数据
127.0.0.1:6379> HGETALL myhash
1) "name"
2) "huixiaoyuan"
3) "sex"
4) "nan"
5) "age"
6) "3"
上一个命令是获取所有的字段,那么现在这个命令是只获取指定哈希表中指定字段的值,命令的格式如下:
HGET key field
如我们获取上面的哈希表中字段为name对应的值
127.0.0.1:6379> HGET myhash name
"huixiaoyuan"
删除一个或多个哈希表字段的命令是HDEL,该命令可以删除指定哈希表中指定的字段,以及其对应的值,格式如下:
HDEL key field1 [field2…]
如我们要删除索引为“myhash”的哈希表中值为“3”,对应字段为“age”的字段和值为“nan”,对应字段为“sex”的两个字段。
127.0.0.1:6379> HGET myhash name
"huixiaoyuan"
127.0.0.1:6379> HDEL myhash age sex
(integer) 2
127.0.0.1:6379> HGETALL myhash
1) "name"
2) "huixiaoyuan"
该命令可以获取指定哈希表中字段的数量,格式如下:
HLEN key
127.0.0.1:6379> HLEN myhash
(integer) 1
该命令可以获取指定哈希表中所有的字段,但是不返回字段对应的值,格式如下:
HKEYS key
127.0.0.1:6379> HKEYS myhash
1) "name"
上一个命令是获取到指定哈希表中所有的字段,但是不返回字段对应的值,那么这个命令就是获取到所有的值,而不返回其对应的字段,格式如下:
HVALS key
127.0.0.1:6379> HVALS myhash
1) "huixiaoyuan"
我正在尝试使用 Rust 的 std::hash 函数: use std::hash::{hash, Hash, SipHasher}; #[test] fn hash_test() { pr
我有以下内容 friends = [{ name: "Jack", attr1:"def", attr2:"def" }, { name: "Jill", attr1:"def", attr2:"de
我有以下数组: names = [ {"Adriana"=>{:gender=>"female", :nationality=>"danish"}}, {"Adriane"=>{:gender=>"f
我有一个哈希的 Perl 哈希......大约 11 或 12 个元素深。请原谅我没有重复下面的结构! 一些级别有固定的标签,例如'NAMES' , 'AGES'或类似的,因此访问这些级别很好,因为我
我试图派生一个描述结构化值的Graphviz文件。这是出于诊断目的,因此我希望我的图形尽可能接近地反射(reflect)内存中的实际结构。我正在使用下面的方法将值映射到Graphviz顶点,以便当一个
我正在尝试获取在 xlm 中传递的事件日志条目,将它们转换为散列,然后存储到数据库中。 我目前正在使用 XmlSimple gem 将 xml 输入转换为散列。 测试样本输入: require 'xm
对于 Ruby 中的 Hash,reject! 和 reject 与 delete_if 有何不同?谁能用简单的代码片段解释它们之间的区别? 最佳答案 由于其他答案指的是 Array#delete_i
我正在尝试处理我使用 Data::Dumper 输出的 perl 数据结构 $VAR1 = 'GAHD'; $VAR2 = [ { 'COUNTRY' => 'US',
无法使用来自辅助进程的现有 rte Hash: h = rte_hash_find_existing("some_hash"); if (h) { // this will w
我有一个散列的散列,其中第一个键是一个字符串,第二个键是一个整数。我试图在散列的散列中获得最低的第二个键。这是我的哈希。 %HoH = ( flintstones => { 8
如何从一系列数组中生成哈希中的哈希?我需要从这里开始: my @data = /one two three/; my $value = 13: 为此: $hoh = { 'one' => { 'two
我有这个配置文件 dbUser=customer dbPass=passwrd dbSid=customer.shadow passwdFile=/production/etc-user tmpUse
我想实现一种thing,可以唯一标识,除此之外,它不包含其他字段。它有点像 ruby 中的 BasicObject 或 java 中的 Object。 我添加了一个 PartialEq 特征。 s
我正在尝试使用以下键存储二维哈希: 维度 1 = 数字但不连续 维度 2 = 字符串(如 :id 和 :value) 当元素未初始化时会出现问题。 memory = Hash.new(Hash.new
我目前正在学习 Michael Hartl 的 Ruby on Rails 教程 不理解在 section 4.4.1 中找到的此语句的含义: Hashes, in contrast, are dif
我很乐意通过更短的表达式访问多维哈希数组的任何元素 h = {a: {b: 'c'}} # default way p h[:a][:b] # => "c" # a nicer way p h[:a,
我想在编写 flutter channel beta 后运行 flutter web 它回复:Can't load kernel binary:Invalid SDK hash,你知道如何解决这个问题
我最近正在研究 Amazon 提供的新 NoSQL 服务,更具体地说是 DynamoDB。 亚马逊说你应该避免使用不均匀分布的键作为主键,即主键应该越独特越好。我可以认为这是最好的情况下每个项目都有唯
我的游戏中有很多哈希值,例如 HMSET('hash1', 'level', 25, 'connected', 2) HMSET('hash2', 'level', 50, 'connected',
我必须翻译这句话:'Susspected overpass-the-hash attack (Kerberos)' 我发现了这篇关于立交桥哈希的文章:https://blog.stealthbits.
我是一名优秀的程序员,十分优秀!