redis学习-8-Redis数据类型与Lua脚本

Redis是一种Key-Value类型的缓存数据库,支持五种数据类型:string、hash、list、set和zset。string是最基础的类型,hash用于存储键值对,list是按插入顺序排列的元素集合,set是无序且不重复的元素集合,zset是有序集合。此外,Redis从2.6版本开始支持内置的Lua解释器,允许执行Lua脚本,以原子性方式执行并减少网络开销。
摘要由CSDN通过智能技术生成

4.Redis数据类型(简略)

  • Redis 是 Key-Value 类型缓存型数据库,Redis 为了存储不同类型的数据,提供了五种常用数据类型,这里指的数据类型是 Value(值) 的数据类型,而非 key。如下所示:
  • string(字符串)
  • hash(哈希散列)
  • list(列表)
  • set(集合)
  • zset(sorted set:有序集合)
4.1 string字符串
  • String 是 Redis 最基本的数据类型,可理解成与Memcached如出一辙的类型。字符串是一组字节,在 Redis 数据库中,字符串具有二进制安全(binary safe)特性,这意味着它的长度是已知的,不由任何其他终止字符决定的,一个字符串类型的值最多能够存储 512 MB 的内容。

  • 二进制安全:是一种主要用于字符串操作函数的计算机编程术语。只关心二进制化的字符串,不关心具体的字符串格式,严格的按照二进制的数据存取。这保证字符串不会因为某些操作而遭到损坏。

  • SET 命令储存一个字符串,然后使用 GET 命令查看它:

#使用 Redis 存储了一个键为 title,值为 主题 的 string 类型数据。
27.0.0.1:6379> set title "主题"
OK
127.0.0.1:6379> get title
"主题"
  • 当然可以使用 MSET 命令一次性存储多个键值对,并使用 MGET 命令查询多个 key,如下所示:
127.0.0.1:6379> mset password 123 456 789
OK
127.0.0.1:6379> mget password
1) "123"
127.0.0.1:6379> mget 456
1) "789"
4.2 hash散列
  • hash 散列是由字符串类型的 field 和 value 组成的映射表,可以把它理解成一个包含了string类型的多个键值对的集合映射表,相似Java里面的Map<String,Object>。由于 Hash 类型具有上述特点,所以一般被用来存储对象。使用 HMSET 命令来存储一个包含了用户基本信息的对象,如下所示:
127.0.0.1:6379> hmset user:1 name zs pwd 123456 age 11
OK
127.0.0.1:6379> hgetall user:1
1) "name"
2) "zs"
3) "pwd"
4) "123456"
5) "age"
6) "11"

remote:0>hset user name zhangsan
"1"
remote:0>type user
"hash"
remote:0>hgetall user
 1)  "name"
 2)  "zhangsan"
  • 上述示例中,我们是使用到了 HMSET 和 HGETALL 命令,前者可以同时设置多个字段,后者用来查询全部字段。
  • 一个 Hash 中最多包含 2^32-1 个键值对。
4.3 list列表
  • Redis List 中的元素是字符串类型,其中的元素按照插入顺序进行排列,允许重复插入,最多可插入的元素个数为 2^32 -1 个(大约40亿个),可以添加一个元素到列表的头部(左边)或者尾部(右边),它的底层实际是个链表。

  • 使用 LPUSH 和 LRANGE 命令对 List 数据类型进行简单演示:

#LPUSH 列表添加元素命令
127.0.0.1:6379> lpush course php
(integer) 1
127.0.0.1:6379> lpush course python
(integer) 2
127.0.0.1:6379> lpush course c++
(integer) 3
#LRANGE 查看列表元素
#最开始插入的在最后,最后插入位于第一个位置,和栈相似。
127.0.0.1:6379> lrange course  0 2
1) "c++"
2) "python"
3) "php"
  • 注意:Redis 的列表类型同样遵循索引机制,都是从零开始。
4.4 set集合
  • Redis Set 是一个字符串类型元素构成的无序集合。在 Redis 中,集合是通过哈希映射表实现的,所以无论是添加元素、删除元素,亦或是查找元素,它们的时间复杂度都为 O(1)。
  • 下面通过 SADD 命令添加 string 元素到 Set 集合中,若添加成功则返回 1,如果元素已经存在,则返回 0。示例如下:
127.0.0.1:6379> sadd courseset php
(integer) 1
127.0.0.1:6379> sadd courseset python
(integer) 1
127.0.0.1:6379> sadd courseset c++
(integer) 1
127.0.0.1:6379> sadd courseset c++
(integer) 0
127.0.0.1:6379> sadd courseset c++
(integer) 0
#SMEMBERS命令查看集合中元素,元素会无序排列
127.0.0.1:6379> smembers courseset
1) "c++"
2) "python"
3) "php"
  • 由于 Set 集合中的成员具有唯一性,所以重复插入 HTML 元素不会成功,集合的同样可容纳 2^32 -1 个元素。

  • 注意:new HashSet 底层至关于new HashMap

4.5 zset有序集合
  • Redis zset 是一个字符串类型元素构成的有序集合,集合中的元素不仅具有唯一性,而且每个元素还会关联一 个 double 类型的分数,该分数允许重复。Redis 正是通过这个分数来为集合中的成员进行从小到大的排序。
127.0.0.1:6379> del course
(integer) 1
127.0.0.1:6379> zadd course 0 php
(integer) 1
127.0.0.1:6379> zadd course 1 python
(integer) 1
127.0.0.1:6379> zadd course 2 c++
(integer) 1
127.0.0.1:6379> zadd course 3 redis
(integer) 1
#重复元素无法添加成功
127.0.0.1:6379> zadd course 3 redis
(integer) 0
127.0.0.1:6379> 
#重复分值添加成功
127.0.0.1:6379> zadd course 4 mq
(integer) 1
127.0.0.1:6379> zadd course 4 db
(integer) 1
#查看指定成员的分值
127.0.0.1:6379> zscore course c++
"2"
#查看zset中的所有成员
127.0.0.1:6379> zrange course 0 5
1) "php"
2) "python"
3) "c++"
4) "redis"
5) "db"
6) "mq"
  • 除了上述五种类型之外,Redis 还支持 HyperLogLog 类型,以及 Redis 5.0 提供的 Stream 类型。在后续小节会做相应介绍。

  • 在线练习工具:https://try.redis.io/

  • 查看更多命令:https://redis.io/commands

24.Lua脚本

  • 从 Redis 2.6 版本开始,Redis 使用内置的 Lua 解释器执行脚本,这意味着我们可以直接在 Redis 客户端执行Lua 脚本 ,于此同时 Redis 还提供了用于编写 Lua 脚本的EVAL命令。

  • Lua 是一种轻量小巧、开源的脚本语言,用标准 C语言编写。其设计目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它被广泛的应用于:游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件等。

  • Redis 使用EVAL命令编写 lua 脚本,其语法格式如下:

127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]  
  • 参数说明如下:
    • script: 该参数表示使用 Lua 语言编写的一段脚本程序,该脚本不必定义为 Lua 函数格式;
    • numkeys: 用于指定 key 参数的数量;
    • key [key …]: 从 EVAL 命令的第三个参数算起,表示脚本中用到的所有 key。这些 key 可以使用全局变量 KEYS 数组来访问,比如 KEYS[1] 、KEYS[2] 以此类推。
    • arg [arg …]:表示附加参数,在 Lua 语言中通过全局变量 ARGV 数组访问,访问的形式与 KEYS 数组相同,比如 ARGV[1] 、 ARGV[2]。
  • 示例:在 Redis 客户端使用 Lua 语言编写“hello lua”并将其输出。
#使用 Lua 解释器执行脚本。
#eval命令		脚本		  key参数数量	
remote:0>eval "return 'hello lua!'" 0
"hello lua!"
  • Lua脚本作用:虽然 Redis 官网提供了丰富指令集(200多个),但是在某些特定的领域需要对指令进行扩充,因此 Redis 允许我们使用 Lua 语言以自定义的方式编写脚本命令,这满足了一部分用户的需求。Redis 服务器会以单线程、原子性的方式执行 Lua 脚本,保证 Lua 脚本在处理过程中不会被其他请求中断。

  • 使用 Lua 脚本有如下好处:

    • 减少网络开销:可以将多个请求通过脚本的形式一次发送,从而减少网络时延,比如本来 10 次网络请求,我们就可以通过 Lua 脚本一次性完成。
    • 原子操作:Redis 会将整个脚本作为一个整体执行,中间不会被其他请求干扰。因此在脚本运行过程中无需使用事务。
    • 脚本复用:客户端发送的脚本会一直存储在 Redis 中,这样其他客户端只需对这个脚本稍作修改就可以达到复用的目的,极大地提升了编写脚本的效率。
  • 常用脚本命令:

命令说明
EVAL script numkeys key [key …] arg [arg …]使用 Lua 解释器执行脚本。
EVALSHA sha1 numkeys key [key …] arg [arg …]Lua 解释器根据 sha1 校验码执行脚本。
SCRIPT EXISTS script [script …]查看指定的脚本是否保存在于缓存当中。
SCRIPT FLUSH从脚本缓存中移除所有脚本。
SCRIPT KILL杀死当前正在运行的 Lua 脚本。
SCRIPT LOAD script将脚本 script 添加到脚本缓存中,但不马上执行这个脚本。
  • 基本命令使用:
#使用 Lua 解释器执行脚本。
remote:0>eval "return 'hello lua!'" 0
"hello lua!"
#查看指定的脚本是否保存在于缓存当中。
remote:0>script exists "return 'hello lua!'"
 1)  "0"
#将脚本 script 添加到脚本缓存中,但不马上执行这个脚本。
remote:0>script load "return 'hello lua!'"
"8017f802646ee5212ebda63993d806214217e772"

#脚本中全局变量KEYS[n]、ARGV[n]的使用,
remote:0>eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 name age zs 18
 1)  "name"
 2)  "age"
 3)  "zs"
 4)  "18"

注意:KEYS[n]、ARGV[n]都大写,负责无法识别该全局变量

下一篇:redis学习-9-Redis命令行模式和客户端/服务器命令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值