Redis(2)- RedisAPI与LUA使用

  • Post author:
  • Post category:其他


前言

主要包括Redis基本数据类型API,Redis结合Lua脚本使用,Redis一些属性配置


概念

  1. 过期时间
    expire/pexpire key ttl ttl 秒/毫秒 过期
    expireat/pexpireat key timestamp :过期时间设置为指定的timestamp 秒/毫秒
    redis底层使用pexpireat实现
    ttl / pttl key : 查询过期剩余秒/毫秒数 未设置过期为-1 非法时间为-2

一、Redis基本数据类型及API

1.基本数据类型

  • string

    最大不超过512M

    • int(long类型的整数)编码实现字符串对象。
      如果一个字符串对象,保存的值是一个整数值,并且这个整数值在long 范围内。

    • embstr(embstr编码的简单动态字符串)编码实现字符串对象。
      如果字符串对象保存的是一个字符串,但是长度小于等于39个字节。

    • raw(简单动态字符串)编码实现字符串对象。
      如果字符串对象保存的是一个字符串,但是长度大于39个字节。

`set key value ex()/px(毫秒) time(过期时间)`
set age 19 ex 10 :设置age10秒后过期

`del key `:删除key

incr key :key加1操作 返回增加后的值
incrby key num:key加num操作
decr key :整数key减1
decrby key num:整数key 减num
incrbyfloat key 1.1 :浮点型key+1.1

`setnx key value :如果key不存在设置key值为value,返回1 否则返回0`

`mset key value [key value ...] :批量设值`
mset name zcp age 20 sex 男

`mget key ...` :批量获取

`append key value `:key追加value值
`strlen key `:返回key长度
`getrange key start end `:获取截取的字符串(包括start end ,下标从0开始)
set name zcp ; getrange name 12 返回 cp 
  • hash

    使用场景:是一个string类型的field和value的映射表,hash特适合用于存储对象。对于更新不多的情况下,可以使用序列化,对于VALUE值不大于64字节可以使用hash类型

    • ziplist(压缩列表)实现的哈希对象
      hash 对象保存的所有键、值长度小于等于64字节并且键值对数量小于等于512时使用

    • hashtable(字典)实现的哈希对象
      不满足 ziplist 压缩列表条件时使用

`hset key field value `:设key单个field值
`hget key filed`:取key的field值
`hmget key field ...`:取key的多个field值
`hgetall key`:取key的所有field
`hdel key field ...`:删除多个field
`hlen key`:计算key的field个数
`del key`:删除key
`hexists key field `:判断field是否存在
`hkeys key `:获取key的所有field
`hvals key`:获取key的所有value

增减操作
`hincrbyfloat key filed 2`:对key的filed值加2
  • list

    一个列表最多可存2的32次方减1个元素

    • Redis 3.2之前

      • ziplist(压缩列表)实现的列表对象。
        列表长度小于512,并且列表保存的所有字符串元素长度小于64字节。

      • linkedlist(双端链表)实现的列表对象。
        不满足 ziplist 压缩列表条件的都用 linkedlist 双端链表。

    • Redis 3.2之后

      • quicklist(快速链表),所有列表的底层实现都是这个,底层是将 ziplist 压缩列表linkedlist 双端链表进行了结合。
`lpush key value ...`:从左往右设值value到list类型的key中
`rpush key value `:从右往左

lpush list:001 1 2 3 4 

`lrange key start end `:从list类型key中获取start end位置的值(包含 start end)
`lrange key 0 -1 `:获取key的所有元素
lrange list:001 0 3

`linsert key before/after pivot value`:在key的pivot之前或之后插入value
linsert list:001 before 9 8:在9之前插入8
如果pivot有多个,会找最先找到的那一个

`lindex key index`:获取key的index位置元素(如果为负值,往后数 -1 就是最后一位)

`llen key`:获取key的总元素量

`lpop key`:把左边第一个元素删除
`rpop key`:把右边第一个元素删除

`lrem key num pivot`:从左边开始删除值为pivot的num个元素

`lrem key 0 pivot`:检索所有pivot全部删除

`ltrim key start end`:保留key从start到end的元素,其它全部删除

`lset key index value`:设置key中index位的元素值为value

  • set

    一个列表最多可存2的32次方减1个元素
    使用场景:用户标签,社交,查询有共同兴趣爱好的人,智能推荐

    • intset(整数集合)实现的集合对象
      集合内所有对象都是整数,并且集合的长度小于等于512时使用。

    • hashtable(字典)实现的集合对象
      不满足 intset 整数集合的条件时使用。

`sadd key value ...`:往set类型的key中添加value元素

sadd set:001 1 2 3 3 4 :返回3(实际插入的数量) , 重复的会去除

`exists key`:判断key是否存在
exists set:001 :存在返回 1 不存在返回 0

`smembers key`:展示key的所有值
 smember set:001 :1 2 3 4

`srem key member`:删除key中指定元素值member

`scard key`:返回key的总元素数量

`sismember key member`:判断key中是否存在member元素

`srandmember key count`:随机从key中返回count个元素

`spop key count`:随机从key中弹出count个元素,并从key中删除

sadd set:001 1 2 3 4
sadd set:002 2 3 4 5

`sinter key...`:返回所有key中元素的交集
sinter set:001 set:002:2 3 4
`sunion key...`:返回所有key中的元素的并集
sunion set:001 set:002:1 2 3 4 5
`sdiff key...`:返回key中元素的差集(以第一个key为准)
sdiff set:001 set:002:1
sdiff set:002 set:001:5


  • zset

    一个列表最多可存2的32次方减1个元素
    常用于排行榜,如视频网站需要对用户上传视频做排行榜,或点赞数

    • ziplist(压缩列表)

    • skiplist(跳跃表和字典)实现的有序集合对象
      不满足 ziplist 压缩列表条件时使用。

`zadd key nx/xx score member`:设置key的元素名称为member的分值为score,nx(不存在则插入) 
xx(必须存在做更新)
ch(返回操作结果)
zadd zset:001 20 age20
zadd zset:001 nx 21 age21 :nx不存在新增
zadd zset:001 22 age23
zadd zset:001 xx incr 1 age23:22+1=23

zadd zset:001 xx ch incr -1 age24:ch返回操作结果

`zrange key start end withscores`:查看score数据 zrevrange 倒序
zrange zset:001 0 -1 withscores
1) "age20"
 2) "20"
 3) "age22"
 4) "22"
 5) "age23"
 6) "23"
 7) "age24"
 8) "25"
 9) "age25"
10) "25"

`zcard key`:统计成员个数
zcount
zset是分数越小越排前面
`zscore key member`:查看成员member分数

`zrank key member`:返回成员排名 升序
`zrevrank key member`:返回成员排名 倒序
`zrem key member...`:删除成员
`zincrby key increment member`:增加分数

`zrangebyscore key (start +inf withscores`:查询大于start的数据

`zrevrangebyscore key (end -inf withscores`:查询小于end的数据
`zremrangebyscore/zremrangebyrank`:删除

`zinterstore zset:012 2 zset:001 zset:002 aggregate sum`:交集score求和产生的数据放到zet:012上

`zinterstore user_jjmax 2 user:7 user:8 aggregate max 或min`:取

2.操作

`keys *` :遍历所有键 *是用来匹配

`keys [j,k]*`:遍历j,k开头的所有键

`单线程,生产环境不建议使用,如果键多可能会造成阻塞;`

`scan`:用于迭代当前数据库中的数据库键。
如果数据集合不是以哈希表作为底层实现的话,则scan类命令无视count选项,直接返回数据集合中的所有元素

`scan 0 match *`:匹配以n开头的键,最大是取10条,第一次scan 0开始

注:可有效地解决keys命令可能产生的阻塞问题
除scan字符串外:还有以下
`SCAN 命令用于迭代当前数据库中的数据库键。`
`scan 0 match *`
`SSCAN 命令用于迭代集合键中的元素。`
`sscan set:001 0 match *`
`HSCAN 命令用于迭代哈希键中的键值对。`
`hscan user:001 0 match *`
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
用法和scan一样
zscan zset:001 0 match *

multi #开启事务
watch #取消事务
exec #提交事务

二.Redis使用LUA脚本

Lua是一个小巧的脚本语言, Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。

1 LUA在Redis上的应用-硬编码

Lua脚本提供了原子性
Lua脚本在Redis使用方法
方法定义参数:(operate [操作 get set hget等], KEYS[1]……KEYS[n] [参数个数N], args1……argsn)  
调用方法传参:( n , 1……n , args1……argsn)  
使用Lua脚本获取string key值
set name zcp
eval "return redis.call('get',KEYS[1])" 1 name

在这里插入图片描述


2 LUA在Redis上的应用-使用脚本文件

Redis可以加载Lua脚本文件,返回SHA值,然后Redis根据SHA值调用 evalsha

三、Redis配置文件使用

Redis指令生命周期:发送,排队,执行,返回
Redis所有的配置变量都可以动态设置(重启失效)和配置文件设置(持久化)
使用config set完后,若想将配置持久化保存到redis.conf,要执行config rewrite
#慢日志
slowlog-log-slower-than 10000 #微秒 = 10毫秒
slowlog-max-len 128 #慢查询队列存放的最大条数、第129进来 第一条会出去
slowlog get #获取慢查询记录
#动态设置 动态设置执行超过5毫秒的日志为慢日志
config set slowlog-log-slower-than 5000 

192.168.42.120:6379> slowlog get
1) 1) (integer) 5					#第5+1条入队列的慢查询 
   2) (integer) 1610639456			#时间戳
   3) (integer) 58269				#执行时间
   4) 1) "keys"						#指令
      2) "*"						#
   5) "192.168.42.120:57678"		#
   6) ""
2) 1) (integer) 4
   2) (integer) 1610638466
   3) (integer) 601
   4) 1) "SET"
      2) "str:25845"
      3) "25845"
   5) "192.168.42.1:3004"
   6) ""


版权声明:本文为cleancp原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。