Redis五种基础数据类型-string(字符串)

本文深入探讨了Redis中键的全局命令及字符串(string)数据结构的详细操作,包括setnx、getrange、mset、setex、set、get、getbit、setbit、decr、decrby、strlen、msetnx、incrby、incrbyfloat、setrange、psetex、append、getset、mget和incr等命令的使用方法与场景。
摘要由CSDN通过智能技术生成


Redis是互联网技术领域使用最为广泛的存储中间件,它是Remote Dictionary Service(远程字典服务)的缩写。Redis以其超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。

Redis五种基础数据结构:

  • string(字符串)
  • list(列表)
  • hash(字典)
  • set(集合)
  • zset(有序集合)

键常用全局命令

命令说明
keys *查看所有键(只显示key)
dbsize键总数
exists key检查键是否存在(存在返回1,不存在返回0)
del key [key…]删除键,可删除多个,空格隔开即可,返回值为删除键的个数,不存在的会忽略
expire key seconds键过期,设置键多久后过期,过期后会自动删除键
ttl key查看键的剩余过期时间,它有三种返回值,大于0:剩余时间;-1:键没设置过期时间;-2:键不存在
type key键的数据结构类型

string

字符串string是Redis最简单的数据结构,它的内部表示就是一个字符数组。Redis所有的数据结构都以唯一的key字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结 构的差异就在于 value 的结构不一样。

字符串结构使用非常广泛,一个常见的用途就是缓存用户信息。我们将用户信息结构体 使用 JSON 序列化成字符串,然后将序列化后的字符串塞进 Redis 来缓存。同样,取用户信息会经过一次反序列化的过程。
在这里插入图片描述

Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于 1M 时, 扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是 字符串最大长度为 512M

启动redis

redis-server /usr/local/redis-4.0.9/redis.conf

打开另一个窗口进入redis界面

redis-cli

实现string的增删改查

127.0.0.1:6379> set name herobin
OK
127.0.0.1:6379> get name
"herobin"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)

对string类型的批量读写

127.0.0.1:6379> set name1 xiaozhang
OK
127.0.0.1:6379> set name2 xiaowang
OK
127.0.0.1:6379> mget name1 name2 name3   # 返回一个列表
1) "xiaozhang"
2) "xiaowang"
3) (nil)
127.0.0.1:6379> mset name1 boy name2 girl name3 unknown
OK
127.0.0.1:6379> mget name1 name2 name3
1) "boy"
2) "girl"
3) "unknown"

可以对key设置过期时间,到时间会被自动删除,这个功能常用来控制缓存的失效时间。

127.0.0.1:6379> set name hero
OK
127.0.0.1:6379> get name
"hero"
127.0.0.1:6379> expire name 5	# 5s 后过期
(integer) 1
127.0.0.1:6379> get name	# 等待5s后查询 下面输出nil
(nil)
127.0.0.1:6379> setex name 5 hero	# 5s后过期,等价于set+expire
OK
127.0.0.1:6379> get name	# 5s内
"hero"
127.0.0.1:6379> get name	# 5s后
(nil)
127.0.0.1:6379> setnx name newhero	#如果name不存在就执行set创建
(integer) 1
127.0.0.1:6379> setnx name newhero	#因为name已经存在,所以set创建不成功
(integer) 0
  • 计数
    如果value值是一个整数,可以对它进行自增操作。自增是有范围的,它的范围在signed long的最大值和最小值之间,超出了这个范围,Redis会报错。
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> incr age
(integer) 21
127.0.0.1:6379> incrby age 5
(integer) 26
127.0.0.1:6379> incrby age -5
(integer) 21
127.0.0.1:6379> set ageMax 9223372036854775807
OK
127.0.0.1:6379> incr ageMax
(error) ERR increment or decrement would overflow
127.0.0.1:6379> 

string命令详解

setnx

Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。SETNX KEY_NAME VALUE

redis> EXISTS job                # job 不存在
(integer) 0 
redis> SETNX job "programmer"    # job 设置成功
(integer) 1
redis> SETNX job "code-farmer"   # 尝试覆盖 job ,失败
(integer) 0
redis> GET job                   # 没有被覆盖
"programmer"

getrange

Getrange 命令用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。GETRANGE KEY_NAME start end

redis 127.0.0.1:6379> SET mykey "This is my test key"
OK
redis 127.0.0.1:6379> GETRANGE mykey 0 3
"This"
redis 127.0.0.1:6379> GETRANGE mykey 0 -1
"This is my test key"

mset

Mset 命令用于同时设置一个或多个 key-value 对。MSET key1 value1 key2 value2 .. keyN valueN

redis 127.0.0.1:6379> MSET key1 "Hello" key2 "World"
OK
redis 127.0.0.1:6379> GET key1
"Hello"
redis 127.0.0.1:6379> GET key2
1) "World"

setex

Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。
SETEX KEY_NAME TIMEOUT VALUE

redis 127.0.0.1:6379> SETEX mykey 60 redis
OK
redis 127.0.0.1:6379> TTL mykey #  TTL 命令以秒为单位返回 key 的剩余过期时间。
60
redis 127.0.0.1:6379> GET mykey
"redis

set

SET 命令用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。
SET KEY_NAME VALUE

# 对不存在的键进行设置 
redis 127.0.0.1:6379> SET key "value"
OK 
redis 127.0.0.1:6379> GET key
"value"  
# 对已存在的键进行设置 
redis 127.0.0.1:6379> SET key "new-value"
OK 
redis 127.0.0.1:6379> GET key
"new-value"

get

Get 命令用于获取指定 key 的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。GET KEY_NAME

# 对不存在的 key 或字符串类型 key 进行 GET 
redis> GET db
(nil) 
redis> SET db redis
OK 
redis> GET db
"redis" 
# 对不是字符串类型的 key 进行 GET
 redis> DEL db
(integer) 1 
redis> LPUSH db redis mongodb mysql
(integer) 3
 redis> GET db
(error) ERR Operation against a key holding the wrong kind of value

getbit

Getbit 命令用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
GETBIT KEY_NAME OFFSET

# 对不存在的 key 或者不存在的 offset 进行 GETBIT, 返回 0 
redis> EXISTS bit
(integer) 0 
redis> GETBIT bit 10086
(integer) 0 
# 对已存在的 offset 进行 GETBIT 
redis> SETBIT bit 10086 1
(integer) 0 
redis> GETBIT bit 10086
(integer) 1

setbit

Setbit 命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
具体介绍;https://www.cnblogs.com/K-artorias/p/8463286.html
Setbit KEY_NAME OFFSET

redis> SETBIT bit 10086 1
(integer) 0 
redis> GETBIT bit 10086
(integer) 1 
redis> GETBIT bit 100   # bit 默认被初始化为 0
(integer) 0

decr

Decr 命令将 key 中储存的数字值减一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。DECR KEY_NAME

# 对存在的数字值 key 进行 DECR
redis> SET failure_times 10
OK
redis> DECR failure_times
(integer) 9
# 对不存在的 key 值进行 DECR
redis> EXISTS count
(integer) 0
redis> DECR count
(integer) -1
# 对存在但不是数值的 key 进行 DECR
redis> SET company YOUR_CODE_SUCKS.LLC
OK 
redis> DECR company
(error) ERR value is not an integer or out of range

decrby

Decrby 命令将 key 所储存的值减去指定的减量值。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
DECRBY KEY_NAME DECREMENT_AMOUNT

# 对已存在的 key 进行 DECRBY
redis> SET count 100
OK
redis> DECRBY count 20
(integer) 80
# 对不存在的 key 进行DECRBY
redis> EXISTS pages
(integer) 0 
redis> DECRBY pages 10
(integer) -10

strlen

Strlen 命令用于获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。STRLEN KEY_NAME

# 获取字符串的长度
redis> SET mykey "Hello world"
OK
redis> STRLEN mykey
(integer) 11
# 不存在的 key 长度为 0 
redis> STRLEN nonexisting
(integer) 0

msetnx

Msetnx 命令用于所有给定 key 都不存在时,同时设置一个或多个 key-value 对。
MSETNX key1 value1 key2 value2 .. keyN valueN

# 对不存在的 key 进行 MSETNX
redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
(integer) 1
redis> MGET rmdbs nosql key-value-store
1) "MySQL"
2) "MongoDB"
3) "redis"
# MSET 的给定 key 当中有已存在的 key
redis> MSETNX rmdbs "Sqlite" language "python"  # rmdbs 键已经存在,操作失败
(integer) 0
redis> EXISTS language                          # 因为 MSET 是原子性操作,language 没有被设置
(integer) 0 
redis> GET rmdbs                                # rmdbs 也没有被修改
"MySQL"

incrby

Incrby 命令将 key 中储存的数字加上指定的增量值。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
INCRBY KEY_NAME INCR_AMOUNT

# key 存在且是数字值
redis> SET rank 50
OK
redis> INCRBY rank 20
(integer) 70
redis> GET rank
"70"
# key 不存在时
redis> EXISTS counter
(integer) 0
redis> INCRBY counter 30
(integer) 30
redis> GET counter
"30"
# key 不是数字值时
redis> SET book "long long ago..."
OK 
redis> INCRBY book 200
(error) ERR value is not an integer or out of range

incrbyfloat

Incrbyfloat 命令为 key 中所储存的值加上指定的浮点数增量值。
如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。
INCRBYFLOAT KEY_NAME INCR_AMOUNT

# 值和增量都不是指数符号
redis> SET mykey 10.50
OK
redis> INCRBYFLOAT mykey 0.1
"10.6"
# 值和增量都是指数符号
redis> SET mykey 314e-2
OK
redis> GET mykey                # 用 SET 设置的值可以是指数符号
"314e-2"
redis> INCRBYFLOAT mykey 0      # 但执行 INCRBYFLOAT 之后格式会被改成非指数符号
"3.14"
# 可以对整数类型执行
redis> SET mykey 3
OK
redis> INCRBYFLOAT mykey 1.1
"4.1"
# 后跟的 0 会被移除
redis> SET mykey 3.0
OK
redis> GET mykey                                    # SET 设置的值小数部分可以是 0
"3.0"
redis> INCRBYFLOAT mykey 1.000000000000000000000    # 但 INCRBYFLOAT 会将无用的 0 忽略掉,有需要的话,将浮点变为整数
"4"
 redis> GET mykey
"4"

setrange

Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。SETRANGE KEY_NAME OFFSET VALUE

redis 127.0.0.1:6379> SET key1 "Hello World"
OK
redis 127.0.0.1:6379> SETRANGE key1 6 "Redis"
(integer) 11
redis 127.0.0.1:6379> GET key1
"Hello Redis"

psetex

Psetex 命令以毫秒为单位设置 key 的生存时间。PSETEX key1 EXPIRY_IN_MILLISECONDS value1

redis 127.0.0.1:6379> PSETEX mykey 1000 "Hello"
OK
redis 127.0.0.1:6379> PTTL mykey # 查看过期时间
999
redis 127.0.0.1:6379> GET mykey
1) "Hello"

append

Append 命令用于为指定的 key 追加值。
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
APPEND KEY_NAME NEW_VALUE

# 对不存在的 key 执行 APPEND
redis> EXISTS myphone               # 确保 myphone 不存在
(integer) 0
redis> APPEND myphone "nokia"       # 对不存在的 key 进行 APPEND ,等同于 SET myphone "nokia"
(integer) 5                         # 字符长度
# 对已存在的字符串进行 APPEND
redis> APPEND myphone " - 1110"     # 长度从 5 个字符增加到 12 个字符
(integer) 12 
redis> GET myphone
"nokia - 1110"

getset

Getset 命令用于设置指定 key 的值,并返回 key 旧的值。
GETSET KEY_NAME VALUE

redis 127.0.0.1:6379> GETSET mynewkey "This is my test key"
(nil)
redis 127.0.0.1:6379> GETSET mynewkey "This is my new value to test getset"
"This is my test key"

mget

Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
MGET KEY1 KEY2 .. KEYN

redis 127.0.0.1:6379> SET key1 "hello"
OK
redis 127.0.0.1:6379> SET key2 "world"
OK
redis 127.0.0.1:6379> MGET key1 key2 someOtherKey
1) "Hello"
2) "World"
3) (nil)

incr

Incr 命令将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
INCR KEY_NAME

redis> SET page_view 20
OK
redis> INCR page_view
(integer) 21 
redis> GET page_view    # 数字值在 Redis 中以字符串的形式保存
"21"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值