【Redis 系列】redis 学习三,redis 数据结构之 string 和 list 基本使用及熟悉

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis 系列】redis 学习三,redis 数据结构之 string 和 list 基本使用及熟悉

【Redis 系列】redis 学习三,redis 数据结构之 string 和 list 基本使用及熟悉

redis 五大数据结构

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件

它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询

Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)

redis key 的基本命令

  • ping

查看客户端是否连接成功

  • set key value

设置 key  和 value

  • get key

获取 key 的值

  • keys *

获取所有 key

  • move key 1

删除 key

  • expire key number

对 key 设置过期时间

  • ttl key

查看 key 的剩余有效时间

  • type key

查看 key 的类型

  • EXISTS key

查看是否存在 key

root@iZuf66y3tuzn4wp3h02t7pZ:/# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name xiaomotong
OK
127.0.0.1:6379> get name
"xiaomotong"
127.0.0.1:6379> type name
string
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS xiaozhu
(integer) 0
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> keys *
1) "name"
2) "age"
127.0.0.1:6379> set hobby sports
OK
127.0.0.1:6379> EXPIRE hobby 20
(integer) 1
127.0.0.1:6379> ttl hobby
(integer) 14
127.0.0.1:6379> ttl hobby
(integer) 13
127.0.0.1:6379> get hobby
(nil)
127.0.0.1:6379> move name 1
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379>

string 字符串

设置单个值

  • APPEND key value

在字符串后面追加字符串

  • STRLEN key

计算 key 对应 value 的长度

  • incr key

对 key 的值 +1

  • decr key

对 key 的值 -1

  • INCRBY key number

对 key +number

  • DECRBY key number

对 key -number

  • GETRANGE key start  end

获取字符范围,获取 key 对应 value 的 第 start 到 end 的字符串

GETRANGE key 0 -1get key 是一个效果

  • setrange key offset value

替换 key 对应 value 从左到有 offset 个偏移量后面的字符串

127.0.0.1:6379> set name xiaozhu
OK
127.0.0.1:6379> get name
"xiaozhu"
127.0.0.1:6379> APPEND name xiaopang
(integer) 15
127.0.0.1:6379> get name
"xiaozhuxiaopang"
127.0.0.1:6379> STRLEN name
(integer) 15
127.0.0.1:6379> set views 0
OK
127.0.0.1:6379> incr views
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> incr views
(integer) 3
127.0.0.1:6379> decr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> INCRBY views 20
(integer) 22
127.0.0.1:6379> get views
"22"
127.0.0.1:6379> DECRBY views 10
(integer) 12
127.0.0.1:6379> get views
"12"
127.0.0.1:6379> set words "hello wrold"
OK
127.0.0.1:6379> GETRANGE words 2 5
"llo "
127.0.0.1:6379> set key1 xiaozhupeiqi
OK
127.0.0.1:6379> GETRANGE key1 0 -1
"xiaozhupeiqi"
127.0.0.1:6379>
127.0.0.1:6379> setrange key1 4 pangziyo
(integer) 12
127.0.0.1:6379> get key1
"xiaopangziyo"
  • setex key second value (set  with expire)

设置 key 对应的过期时间 ,

  • ttl key

查看 key 的有效时间

  • setnx key value  (if not exist)

如果 key 不存在,那就设置 , 这个指令通常用于分布式锁

127.0.0.1:6379> setex call 30 xiaomotong
OK
127.0.0.1:6379> ttl call
(integer) 24
127.0.0.1:6379> ttl call
(integer) 21
127.0.0.1:6379> setnx call xiaozhu
(integer) 1
127.0.0.1:6379> get call
"xiaozhu"
127.0.0.1:6379> setnx call xiaoming
(integer) 0
127.0.0.1:6379> get call
"xiaozhu"

批量设置多个值

  • mset key value [key value ...]

设置多个 key value

  • mget key [key ...]

获取多个 key 对应的值

  • MSETNX key value [key value ...]

设置多个值,如果 key 不存在,则设置值,这是一个原子操作,要么全部成功,要么全部失败

127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k4"
3) "k3"
4) "k1"
127.0.0.1:6379> mget k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> msetnx k4 44
(integer) 0
127.0.0.1:6379> msetnx k4 44 k5 55
(integer) 0

设置对象

设置对象,咱们可以将 redis 的 key 设计成为我们业务需要的字符 key ,例如下面的例子

127.0.0.1:6379> set student:1:name xiaozhuy
OK
127.0.0.1:6379> set student:2:name xiaopangzi
OK
127.0.0.1:6379> mset student:3:name xiaopeiqi student:3:age 18 student:3:hobby basketball
OK
127.0.0.1:6379> keys student:3*
1) "student:3:hobby"
2) "student:3:age"
3) "student:3:name"
127.0.0.1:6379> mget student:3:hobby student:3:age student:3:name
1) "basketball"
2) "18"
3) "xiaopeiqi"
  • getset

先 get 值,再 set 值

127.0.0.1:6379> getset location beijing
(nil)
127.0.0.1:6379> get location
"beijing"
127.0.0.1:6379> getset location changsha
"beijing"
127.0.0.1:6379> get location
"changsha"

string 字符串的使用场景

string 类型的使用场景非常多,如下列举一些:

  • 计数器
  • 统计多个单位的数量
  • 对象缓存存储
  • 分数,粉丝数,点赞量 等等

List

List 是基本数据类型,即列表

image.png

在 redis 的 List 里面,咱们可以模拟栈,队列,阻塞队列等等

  • LPUSH key element [element ...]

从左边插入数据到 key 中,这个 key 是有个list , list 类型的指令都是l开头

  • RPUSH key element [element ...]
    从右边插入数据到 key 中
  • LRANGE key start stop

查看 list 的范围,

LRANGE key 0 1 查看当前 list 的全部值

127.0.0.1:6379> LPUSH mylist k1
(integer) 1
127.0.0.1:6379> LPUSH mylist k2
(integer) 2
127.0.0.1:6379> LPUSH mylist k3
(integer) 3
127.0.0.1:6379> LRANGE 0 -1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> LRANGE mylist 0 -1
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> LRANGE mylist 0 1
1) "k3"
2) "k2"
127.0.0.1:6379> RPUSH mylist 4
(integer) 4
127.0.0.1:6379> RPUSH mylist 5
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "k3"
2) "k2"
3) "k1"
4) "4"
5) "5"

• LPOP key [count]

从 list 的左边移除数据,默认是 1 个 ,即为移除 list 的第一个元素

  • RPOP key [count]

从 list 的右边移除数据 , 即为移除 list 的最后一个元素

127.0.0.1:6379> LPOP mylist
"k3"
127.0.0.1:6379> LPOP mylist 2
1) "k2"
2) "k1"
127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "5"
127.0.0.1:6379> RPOP mylist
"5"
127.0.0.1:6379> lrange mylist 0 -1
1) "4"
  • LINDEX key index

查看 list 中第 index 个值,从 0 开始

127.0.0.1:6379> keys *
1) "mylist"
127.0.0.1:6379> LRANGE mylist 0 -1
1) "4"
127.0.0.1:6379> LINDEX mylist 1
(nil)
127.0.0.1:6379> LINDEX mylist 0
"4"
  • LLEN key

查看 list 的长度

127.0.0.1:6379> LLEN mylist
(integer) 1
127.0.0.1:6379> LPUSH mylist k6
(integer) 2
127.0.0.1:6379> LPUSH mylist k7
(integer) 3
127.0.0.1:6379> LLEN mylist
(integer) 3
  • LREM key count element

删除 list 中指定的元素,可以指定删除多少个

127.0.0.1:6379> lpush mylist one two three four five
(integer) 5
127.0.0.1:6379> lrange mylist 0 -1
1) "five"
2) "four"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> LREM mylist 1 five
(integer) 1
127.0.0.1:6379> LRANGE mylist 0 -1
1) "four"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lpush mylist one
(integer) 5
127.0.0.1:6379> LRANGE mylist 0 -1
1) "one"
2) "four"
3) "three"
4) "two"
5) "one"
127.0.0.1:6379> LREM mylist 2 one
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "four"
2) "three"
3) "two"
127.0.0.1:6379> LREM mylist 4 ll
(integer) 0

LREM 删除 list 中不存在的数据,返回 0 ,0 为失败,

LREM  删除 list 中存在的数据,若期望删除 5 个,实际上只有 2 个,那么redis 会返回 2 ,删除成功

  • LTRIM key start stop

裁剪,剪枝,获取 list 的某一段,并裁剪下来

127.0.0.1:6379> LRANGE mylist 0 -1
1) "k5"
2) "k4"
3) "k3"
4) "k2"
5) "k1"
6) "four"
7) "three"
8) "two"
127.0.0.1:6379> LTRIM mylist 3 5
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "k2"
2) "k1"
3) "four"
  • RPOPLPUSH source destination

从源 list 中的右边取出数据,从目的 list 的左边加入数据

127.0.0.1:6379> LRANGE mylist 0 -1
1) "k2"
2) "k1"
3) "four"
127.0.0.1:6379> RPOPLPUSH mylist newlist
"four"
127.0.0.1:6379>
127.0.0.1:6379> lrange newlist 0 -1
1) "four"
  • LSET key index element

将 list 中的对应索引的数据,替换成 element ,如果索引本没有数据,则会报错

127.0.0.1:6379> lrange mylist  0 -1
1) "k2"
2) "k1"
127.0.0.1:6379> LSET mylist 1 hello
OK
127.0.0.1:6379> lrange mylist  0 -1
1) "k2"
2) "hello"
127.0.0.1:6379> LSET mylist 10 world
(error) ERR index out of range

• LINSERT key BEFORE|AFTER pivot element

list 中在指定元素的前面或者后面添加数据

127.0.0.1:6379> lrange mylist  0 -1
1) "k2"
2) "hello"
127.0.0.1:6379> LINSERT mylist before hello xiaozhu
(integer) 3
127.0.0.1:6379> lrange mylist  0 -1
1) "k2"
2) "xiaozhu"
3) "hello"
127.0.0.1:6379> LINSERT mylist after hello bottom
(integer) 4
127.0.0.1:6379> lrange mylist  0 -1
1) "k2"
2) "xiaozhu"
3) "hello"
4) "bottom"
  • list 实际是一个链表,before node , after node ,left ,right 都是可以插入数据的
  • 如果 key 不存在,会创建新的 key ,即创建新的链表
  • 如果 key 存在,正常加入数据
  • 如果移除了所有的值,那么 key 就不存在了
  • 在 list 的两边插入和删除数据效率最高,从中间操作数据,效率相对较低

list 列表的应用场景:

list 可以做消息队列(FIFO),也可以做栈(FILO)


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
存储 消息中间件 缓存
Redis 5 种基础数据结构?
Redis的五种基础数据结构——字符串、哈希、列表、集合和有序集合——提供了丰富的功能来满足各种应用需求。理解并灵活运用这些数据结构,可以极大地提高应用程序的性能和可扩展性。
34 2
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
46 5
|
2月前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
2月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
2月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
4月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
49 0
java基础(13)String类
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
63 2
|
3月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
73 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
3月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
64 2
|
4月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①