Redis数据类型(1)

本文介绍了Redis中的String类型及其基本操作,包括exists、append、get/set/getset、incr/decr系列、strlen、setex、setnx、setrange、getrange、mset/mget和del等命令的使用和复杂度,详细解析了每个命令的功能和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.String类型及操作

#:字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以 接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以 容纳的数据长度是512M

2.基本命令:

(1):exists:判断字符串是否存在;

exist mykey

(2):append:O(1)

        如果key以及存在了,append,命令将参数value数据追加到已存在的value的末尾,如果该key不存在,那么就会创建一个新的key/value。
127.0.0.1:6379> exists mykey
(integer) 0
127.0.0.1:6379> APPEND mykey 123
(integer) 3

(3):get key / set key / getset key:O(1)

        get key 获取指定的key的value,如果与该key关联的value不是string类型,redis将返回错误信息,因为get命令只能用于获取string value;

127.0.0.1:6379> exists mykey
(integer) 0
127.0.0.1:6379> APPEND mykey 123
(integer) 3
127.0.0.1:6379> get mykey
"123"

        set key 设定该key持有指定的字符串value,如果该key已经存在,则覆盖原有的值;

127.0.0.1:6379> exists mykey
(integer) 0
127.0.0.1:6379> APPEND mykey 123
(integer) 3
127.0.0.1:6379> get mykey
"123"
127.0.0.1:6379> set mykey abc
OK
127.0.0.1:6379> get mykey
"abc"
127.0.0.1:6379>

         getset key:

        先获取该key的值,再设定该key的值:只能处理string value,否则也会给出相关的错误

127.0.0.1:6379> getset mykey1 abc
"105"
127.0.0.1:6379> get mykey1
"abc"
127.0.0.1:6379> getset mykey
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> get mykey
"abc"
127.0.0.1:6379>

(4):incr key / decr key / decrby key / incrby key : O(1)

       incr key:

         将指定的key的value递增+1,如果该value不存在,其初始值为0,在incr之后其值为1,如果value的值不能装换为整形值,如Hello,该操作将执行失败并返回相应的错误信息(64位有效值)

127.0.0.1:6379> get mykey
"abc"
127.0.0.1:6379> incr mykey
(error) ERR value is not an integer or out of range
127.0.0.1:6379> APPEND mykey1 0
(integer) 1
127.0.0.1:6379> incr mykey1
(integer) 1
127.0.0.1:6379> get mykey1
"1"
127.0.0.1:6379> 

        decr key : O(1)

        将指定的key的value递减1,如果该key不存在,其初始值为0,在decr之后其值为-1,若不能转换为整形值,那么会包对应的错误。

127.0.0.1:6379> decr mykey1
(integer) 0
127.0.0.1:6379> get mykey1
"0"
127.0.0.1:6379> decr mykey
(error) ERR value is not an integer or out of range
127.0.0.1:6379> get mykey
"abc"
127.0.0.1:6379>

        decrby key:

127.0.0.1:6379> INCRBY mykey1 10
(integer) 10
127.0.0.1:6379> get mykey1
"10"
127.0.0.1:6379>

        incrby key:

127.0.0.1:6379> incrby mykey1 100
(integer) 105
127.0.0.1:6379> get mykey1
"105"
127.0.0.1:6379>

(5):strlen:O(1)

        返回指定key的字符值长度,如果value不是string类型,redis将执行失败并给出相关错误信息;

127.0.0.1:6379> get mykey1
"abc"
127.0.0.1:6379> set mykey 1
OK
127.0.0.1:6379> get mykey
"1"
127.0.0.1:6379> STRLEN mykey
(integer) 1
127.0.0.1:6379> STRLEN mykey1
(integer) 3
127.0.0.1:6379> 

(6):setex ttltime value / setnx / setrange / getrange:O(1)

       setex key:

        设置字符串存活时间以及字符串的值:

127.0.0.1:6379> SETEX mykey2 100 "Hello"
OK
127.0.0.1:6379> get mykey2
"Hello"
127.0.0.1:6379> TTL mykey2
(integer) 89
127.0.0.1:6379>

        setnx key:O(1)

        若key存在,那么不做任何操作并且返回key值,若不存在,相当于是set:

127.0.0.1:6379> setnx mykey1 "Hello"
(integer) 1
127.0.0.1:6379> setnx mykey1 "Woeld"
(integer) 0
127.0.0.1:6379> get mykey1
"Hello"
127.0.0.1:6379>

        setrange key offset value:O(1)

        替换指定Key的部分字符串值。从offset开始,替换的长度 为该命令第三个参 数value的字符串长度,其中如果 offset的值大于该Key的原有值Value的字符串长度,Redis将会在Value的后面补齐(offset - strlen(value))数量 的0x00,之后再追加新值。如果该键不存在,该命令会将 其原值的长度假设为0,并在其后添补offset0x00后 再 追加新值。

127.0.0.1:6379> set key1 "Hello World"
OK
127.0.0.1:6379> get key1
"Hello World"
127.0.0.1:6379> getrange key1 0 4
"Hello"
127.0.0.1:6379> setrange key1 0 "Hi"
(integer) 11
127.0.0.1:6379> get key1
"Hillo World"
127.0.0.1:6379>

(7):mset / mget key1 key2 :O(1)

        设置多个key的值,获取多个key的值:如果没有对应的key,则返回nil;

127.0.0.1:6379> mset k1 1 k2 2
OK
127.0.0.1:6379> mget k1 k2 k3
1) "1"
2) "2"
3) (nil)
127.0.0.1:6379>

(8):del key:删除key;

127.0.0.1:6379> mget k1 k2 k3
1) "1"
2) "2"
3) (nil)
127.0.0.1:6379> mget mykey mykey1
1) "1"
2) "Hello"
127.0.0.1:6379> del k1 k2 mykey mykey1
(integer) 4
127.0.0.1:6379> mget k1 k2 k3
1) (nil)
2) (nil)
3) (nil)
127.0.0.1:6379> mget mykey mykey1
1) (nil)
2) (nil)
127.0.0.1:6379>

3.hash类型

        我们可以将Redis中的Hashes类型看成具有String KeyString Valuemap容器。所以该类型非常适合 于存储值对象的信息。如UsernamePasswordAge等。如果Hash中包含很少的字段,那么 该类型 的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
        简单来说就是键,字段,值!!!!!!
(1):hset / hget key1 value1 key2 value2 ... L指定字段以及字段值,也可删除字段:
127.0.0.1:6379> hset tom name lishutong age 30
(integer) 2
127.0.0.1:6379> hget tom name
"lishutong"
127.0.0.1:6379> hget tom age
"30"
127.0.0.1:6379> hdel tom name
(integer) 1
127.0.0.1:6379> hget tom name
(nil)
127.0.0.1:6379> hget tom age
"30"
127.0.0.1:6379> 

(2):HEXISTS  key:判断制定字段是否存在:

127.0.0.1:6379> hget tom name
(nil)
127.0.0.1:6379> hget tom age
"30"
127.0.0.1:6379> HEXISTS tom name
(integer) 0
127.0.0.1:6379> HEXISTS tom age
(integer) 1
127.0.0.1:6379>

(3):hlen key :统计字段key字段的数量:

127.0.0.1:6379> hget tom name
"li"
127.0.0.1:6379> hget tom age
"30"
127.0.0.1:6379> hget tom sex
"M"
127.0.0.1:6379> hlen tom
(integer) 3
127.0.0.1:6379>

(4):hmset / hmget key filed:获取设定指定字段的值:

127.0.0.1:6379> hmset tom name 'xian' age 60
OK
127.0.0.1:6379> hmget tom name age 
1) "xian"
2) "60"
127.0.0.1:6379> 

(5):hgetall:读取全部的键和值;

127.0.0.1:6379> hgetall tom
1) "age"
2) "60"
3) "name"
4) "xian"
5) "sex"
6) "M"
127.0.0.1:6379>

(6):hincrby key filyed increment: 无 hdecrby,只能给整数加减;

127.0.0.1:6379> HINCRBY tom age 5
(integer) 65
127.0.0.1:6379> hget tom age
"65"
127.0.0.1:6379> HINCRBY tom age 5
(integer) 70
127.0.0.1:6379> hget tom age
"70"
127.0.0.1:6379> 

(7):hkeys / hvals : 键值对应:

127.0.0.1:6379> hkeys tom
1) "age"
2) "name"
3) "sex"
127.0.0.1:6379> HVALS tom
1) "70"
2) "xian"
3) "M"
127.0.0.1:6379>

(8):获取字段值长度:hstrlen key iflyed;

127.0.0.1:6379> HSTRLEN tom name
(integer) 4
127.0.0.1:6379> hget tom name
"xian"
127.0.0.1:6379> 

4.list 类型

        在Redis中,List类型是的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部 (right)添加新的 元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反, 如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。 List中可以包含的最大元素数量 是4294967295。从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操 作,即使链表中已经存储了百万条记录,该操作也可以在常量 时间内完成。然而需要说明的是,如果元 素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
(1):lpush key value:O(1):在指定的key的头部插入参数中给出的所有的values。如果该key存在,那么该命令将在插入之前创建一个与该key关联的空链表,之后再将数据从链表的头部插入,如果该键的value不是链表类型吗,该命令将返回相关的错误信息。
        lrange key start stop :返回链表的所有值。与数据结构链表同理。
127.0.0.1:6379> lpush k1 a b c d
(integer) 4
127.0.0.1:6379> lrange k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange k2 0 -1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>

(2):lpushx key value:O(1):仅有当参数中指定的key存在时,该命令才会在其所关联的list value 的头部插入参数中给出的value,否则将不会有任何操作发生。

127.0.0.1:6379> lpush k1 e
(integer) 5
127.0.0.1:6379> lrange k1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> lpush k2 e
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379>

(3):lpop key:返回并弹出指定key关联的链表中的第一个元素,即头部元素,如果key不存在,则返回nil,链表头部的元素。

127.0.0.1:6379> lrange k1 0 -1
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> LPOP k1 1
1) "e"
127.0.0.1:6379> lrange k1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> LPOP k1 1
1) "d"
127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> 

(4):llen key :返回链表中的元素数量;

127.0.0.1:6379> lrange k1 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> LLEN k1
(integer) 3
127.0.0.1:6379>

(5):lrem key count value : 如果count > 0,则从头开始删对应的value的数字,删除count个value,如果是count < 0,那么从尾部开始到头删除count个value,如果count = 0,那么删除所有的value。

127.0.0.1:6379> LRANGE k1 0 -1
 1) "a"
 2) "c"
 3) "b"
 4) "d"
 5) "a"
 6) "a"
 7) "d"
 8) "a"
 9) "e"
10) "a"
11) "d"
12) "a"
13) "c"
14) "b"
15) "a"
127.0.0.1:6379> LREM k1 2 a
(integer) 2
127.0.0.1:6379> LRANGE k1 0 -1
 1) "c"
 2) "b"
 3) "d"
 4) "a"
 5) "d"
 6) "a"
 7) "e"
 8) "a"
 9) "d"
10) "a"
11) "c"
12) "b"
13) "a"
127.0.0.1:6379> LREM k1 0 a
(integer) 5
127.0.0.1:6379> LRANGE k1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE k1 0 -1
1) "c"
2) "b"
3) "d"
4) "d"
5) "e"
6) "d"
7) "c"
8) "b"
127.0.0.1:6379> LREM k1 -3 d
(integer) 3
127.0.0.1:6379> LRANGE k1 0 -1
1) "c"
2) "b"
3) "e"
4) "c"
5) "b"
127.0.0.1:6379>

(6):lset key index value:替换对应的值为value的值,如果超出了范围,那么就返回相关的错误。

127.0.0.1:6379> LRANGE k1 0 -1
1) "c"
2) "a"
3) "e"
4) "c"
5) "b"
127.0.0.1:6379> LSET k1 0 a
OK
127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "a"
3) "e"
4) "c"
5) "b"
127.0.0.1:6379>

(7):lindex key index:返回对应index的值,为空则返回nil;

127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "a"
3) "e"
4) "c"
5) "b"
127.0.0.1:6379> LINDEX k1 1
"a"
127.0.0.1:6379> LINDEX k1 2
"e"
127.0.0.1:6379>

(8):ltrim key start stop :修建存在得到链表到指定的范围内;

127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "a"
3) "e"
4) "c"
5) "b"
127.0.0.1:6379> LTRIM k1 0 2
OK
127.0.0.1:6379> LRANGE k1 0 -1
1) "a"
2) "a"
3) "e"
127.0.0.1:6379>

(9):linsert key before | after pivot value:在链表中的value前插入(before),在链表中的value后插入对应的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值