打卡30篇博文精通Redis第一篇之——string(字符串)

Posted 李子捌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打卡30篇博文精通Redis第一篇之——string(字符串)相关的知识,希望对你有一定的参考价值。

1、简介

Redis中所有的的数据结构都是通过一个唯一的字符串key来获取相应的value数据。
Redis有5种基础数据结构,分别是:

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

本文讲述的是Redis的5种基础数据结构中的string(字符串)

2、string(字符串)相关介绍

2.1 string(字符串)的内部结构

string(字符串)是Redis最简单也是使用最广泛的数据结构,它的内部是一个字符数组。如图所示:
在这里插入图片描述

Redis中string(字符串)是动态字符串,允许修改;它在结构上的实现类似于Java中的ArrayList(默认构造一个大小为10的初始数组),这是冗余分配内存的思想,也称为预分配;这种思想可以减少扩容带来的性能消耗。
在这里插入图片描述

2.2 string(字符串)的扩容

当string(字符串)的大小达到扩容阈值时,将会对string(字符串)进行扩容,string(字符串)的扩容主要有以下几个点:

  1. 长度小于1MB,扩容后为原先的两倍; length = length * 2
  2. 长度大于1MB,扩容后增加1MB; length = length + 1MB
  3. 字符串的长度最大值为 512MB

3、string(字符串)的指令

3.1 单个键值对增删改查操作

set -> key 不存在则新增,存在则修改

set key value

get -> 查询,返回对应key的value,不存在返回(nil)

get key

del -> 删除指定的key(key可以是多个)

del key [key …]

示例:

127.0.0.1:6379> set name liziba
OK
127.0.0.1:6379> get name
"liziba"
127.0.0.1:6379> set name liziba001
OK
127.0.0.1:6379> get name
"liziba001"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)

3.2 批量键值对

批量键值读取和写入最大的优势在于节省网络传输开销

mset -> 批量插入

mset key value [key value …]

mget -> 批量获取

mget key [key …]

示例:

127.0.0.1:6379> mset name1 liziba1 name2 liziba2 name3 liziba3
OK
127.0.0.1:6379> mget name1 name2 name3
1) "liziba1"
2) "liziba2"
3) "liziba3"

3.3 过期set命令

过期set是通过设置一个缓存key的过期时间,使得缓存到期后自动删除从而失效的机制。

方式一:

expire key seconds

示例:

127.0.0.1:6379> set name liziba
OK
127.0.0.1:6379> get name
"liziba"
127.0.0.1:6379> expire name 10   # 10s 后get name 返回 nil
(integer) 1
127.0.0.1:6379> get name
(nil)

方式二:

setex key seconds value

示例:

127.0.0.1:6379> setex name 10 liziba	# 10s 后get name 返回 nil
OK
127.0.0.1:6379> get name
(nil)

3.4 不存在创建存在不更新

上面的set操作不存在创建,存在则更新;此时如果需要存在不更新的场景,那么可以使用如下这个指令

setnx -> 不存在创建存在不更新

setnx key value

示例:

127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> setnx name liziba		
(integer) 1
127.0.0.1:6379> get name
"liziba"
127.0.0.1:6379> setnx name liziba_98		# 已经存在再次设值,失败
(integer) 0
127.0.0.1:6379> get name
"liziba"

3.5计数

string(字符串)也可以用来计数,前提是value是一个整数,那么可以对它进行自增的操作。自增的范围必须在signed long的区间访问内,[-9223372036854775808,9223372036854775808]

3.5.1 incr -> 自增1

incr key

示例:

127.0.0.1:6379> set fans 1000
OK
127.0.0.1:6379> incr fans # 自增1
(integer) 1001
3.5.2 incrby -> 自定义累加值

incrby key increment

127.0.0.1:6379> set fans 1000
OK
127.0.0.1:6379> incr fans
(integer) 1001
127.0.0.1:6379> incrby fans 999
(integer) 2000
3.5.3 测试value为整数的自增区间

最大值:

127.0.0.1:6379> set fans 9223372036854775808
OK
127.0.0.1:6379> incr fans
(error) ERR value is not an integer or out of range

最小值:

127.0.0.1:6379> set money -9223372036854775808
OK
127.0.0.1:6379> incrby money -1
(error) ERR increment or decrement would overflow

以上是关于打卡30篇博文精通Redis第一篇之——string(字符串)的主要内容,如果未能解决你的问题,请参考以下文章

4月活动|春日学习正当时,一起挑战21天发文打卡

第一篇博文_在IT界打滚打杂了几年,不知未来在那里的新鲜IT咨询师

第一篇博文

第一篇博文

第一篇博文

第一篇博文