Redis入门到精通【基础篇】【三】

本系列作品持续更新中~
Redis入门到精通【基础篇】【一】
Redis入门到精通【基础篇】【二】
Redis入门到精通【基础篇】【三】
Redis入门到精通【实战篇】【一】


Redis数据结构

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样,分为两种,基本类型和特殊类型,基本类型有String(字符串)、Hash(哈希类型)、List(链表)、Set(集合)和SortedSet(有序集合),特殊类型有GEO(地理位置)、BitMap(位图)等

数据类型可以储存的值操作应用场景
String字符串、整数或浮点数对整个字符串或整个字符串的一部分执行操作,对整数和浮点数执行自增或自减操作做简单的键值对缓存
List列表从两端压入或弹出元素,对单个或多个元素进行修剪,只保留一个范围内的元素存储一些列表型的数据结构
Set无序列表添加、移除、获取单个元素,检查一个元素是否存在于集合中,计算交集、并集、差集,从集合里面随机获取元素交集、并集、差集的操作
Hash包含键值对的无序散列表添加、获取、移除单个键值对,获取所有键值对,检查某个键是否存在结构化的数据
SortedSet有序集合添加、获取、删除元素,根据分值范围或者成员来获取元素,计算一个键的排名去重但可以排序

Key的层级格式

RedisKey允许多个单词形成层级结构,多个单词之间用:隔开,格式如下:

[key]:[key]:[key]:[value]

这个格式并非固定,在实际使用中按自己的需求增加或删除词条

例如有个schema,其下有useradmin两种数据类型,我们可以这样定义Key

  • user相关的Keyschema:user:[value]
  • admin相关的Keyschema:user:[value]

假如value是一个Java对象,则可以将对象序列号为Json字符串后存储,如下所示:

KeyValue
user{“id”: 1, “name”: “John”, “age”: 20}
admin{“id”: 1, “name”: “Mark”, “role”: “superAdmin”}

Redis命令

我们可以通过官网中文官网来查看Redis命令

我们还可以输入help命令来获取查看Redis命令,如下所示:

help [option]

在这里插入图片描述

输入help @String命令获取String类型分组的命令,如下所示:

help @String

在这里插入图片描述

输入help @generic命令获取通用命令,如下所示:

help @generic

在这里插入图片描述

我们还可以输入help [command]查看一个命令的具体用法

help [command]

在这里插入图片描述

通用命令

通用指令是指不分数据类型的,都可以使用的指令,常见的有:

KEYS

Key有操作的命令,统一返回值都是非0或者0,成功为非0,失败为0

# 查看符合模版的所有Key,不建议在生产环境设备上使用
KEYS [pattern]

# 上述pattern可以包含通配符,例如KEYS *用于查询所有Key
KEYS *

# 删除指定的Key数据,返回值为成功删除的数量
DEL [key]

# 也可以同时删除多个Key
DEL [key] [key] [key]# 判断Key是否存在,存在则返回1,不存在则返回0
EXISTS [key]

# 给一个Key设置有效期,有效期到就会自动删除,单位为秒
EXPIRE [key] [time]

# 查看一个Key的剩余有效期,返回值为剩余有效期,当未对Key设置有效期时,返回值为-1,当设置Key超出有效期时,返回值为-2,其中TTL为Time To Live的缩写
TTL [key]

String类型命令

String类型,也就是字符串类型,是Redis中最简单的存储类型,根据字符串格式不同,还可以分为三类:

  • String(普通字符串)
  • int(整数类型),可以做自增和自减操作
  • float(浮点类型),可以做自增和自减操作

不管哪种格式,底层都是字符数组形式储存,只不过是编码方式不同。字符串的编码类型空间不能超过512m

常见的String命令有:

# 添加或修改一个String类型的键值对
SET [key] [value]

# 根据Key获取String类型的参数
GET [key]

# 将给定的值,追加到某Key的原值的末尾,返回追加后的字符长度
APPEND [key] [value]

# 查询某key的值的长度
STRLEN [key]

# 批量添加多个String类型的键值对
MSET [key] [value]# 批量获取多个String类型的键值对
MGET [key]# 让一个整型的Key自增1,返回自增后的结果
INCR [key]

# 让一个整型的Key自减1,返回自减后的结果
DECR [key]

# 让一个整型的Key自增/自减并指定步长,例如INCRBY/DECRBY number 2即让number值自增/自减2
INCRBY/DECRBY [key] [value]

# 让一个浮点类型的Key自增并指定步长
INCRBYFLOAT [key] [value]

# 添加一个String类型的键值对,前提是这个Key不存在,成功则返回1,失败则返回0
SETNX [key] [name]

# 批量添加,当且仅当所有的key都不存在
MSETNX [key] [value]# 添加一个String类型的键值对,并且指定有效期
SETEX [key] [time] [value]

# 获取某个key值的范围,例如GETRANGE number 0 2,包含0位置的元素,和2位置的元素
GETRANGE [Key] [Start] [End]

List类型命令

Redis中的List类型与Java中的LinkedList类似,可以看做一个双向链表结构。既可以支持正向索引也可以支持反向索引,其特征也与LinkedList类似:

  • 有序
  • 元素可以重复
  • 插入和删除快
  • 查询速度一般

常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等

常用的List命令有:

# 向列表左/右侧插入一个或多个元素
LPUSH/RPUSH [key] [element]

# 移除并返回列表左/右侧的第一个元素,没有则返回null
LPOP/RPOP [key]

# 返回一段角标范围内的所有元素
LRANGE [key] [start] [end]

# 与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
BLPOP/BRPOP [key] [element]

# 按照索引,从左往右获得对应的值
LINDEX [key] [index]

# 获得列表长度
LLEN [key]

# 在某个值的前面/后面添加一个新的值
LINSERT [key] BEFORE/AFTER [value] [newValue]

# 删除n个值为value的数据
LREM [key] [n] [value]

将某个下角标的值换成给定的值
LSET [key] [index] [value]

Hash类型命令

Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构

Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CURD

KeyVALUE
fieldvalue
schema:user:1nameJohn
age20
schema:user:2nameMark
age25

常用的Hash命令有:

# 添加或修改hash类型key类型的field的值
HSET [key] [field] [value]

# 获取一个hash类型key的field的值
HGET [key] [field]

# 批量添加多个hash类型key的field的值
HMSET [key] [field]# 批量获取多个hash类型key的field的值
HMGET [key] [field]# 获取一个hash类型的key中所有的field和value
HGETALL [key]

# 获取一个hash类型的key中的所有field
HKEYS [key]

# 获取一个hash类型的key中的所有value
HVALS [key]

# 让一个hash类型key的字段值自增并指定步长,返回追加后的字符长度
HINCRBY [key] [field] [value]

# 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
HSETNX [key] [field]

SET类型命令

RedisSet结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  • 无序
  • 元素不可重复
  • 查找快
  • 支持交集、并集、差集等功能

常用的Set类型命令有:

# 向set中添加一个或多个元素,如果值已经存在,忽略该值
SADD [key] [member]# 移除set中的指定元素
SREM [key] [member]# 得到集合中所有的值
SMEMBERS [key]

# 判断一个元素是否存在于set中,有则返回1,没有则返回0
SISMEMBER [key] [member]

# 返回set中元素的个数
SCARD [key]

# 求key1与key2的交集
SINTER [key1] [key2]

# 求key1与key2的并集
SUNION [key1] [key2]

# 求key1与key2的差集,即key1中有而key2中没有的元素
SDIFF [key1] [key2]

# 把集合中的一个值移动到另一个集合
SMOVE [key1] [key2] [value]

SortedSet类型命令

RedisSortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,当底层数据结构却差别很大,SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个SkipList(跳表)加hash表,SortedSet具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能

常用的SortedSet类型命令有:

# 添加一个或多个元素到sorted set,如果已经存在则更新其score值
ZADD [key] [score] [member]# 删除sorted set中的一个指定元素
ZREM [key] [member]

# 获取sorted set中指定元素的score值
ZSCORE [key] [member]

# 获取sorted set中的指定元素的排名
ZRANK [key] [member]

# 获取sorted set中的元素个数 
ZCARD [key]

# 统计score值在给定范围内的所有元素的个数,注意最小值和最大值位置不能调换
ZCOUNT [key] [min] [max]

# 让sorted set中的指定元素自增
ZINCRBY [key] [value] [member]

# 按照score排序后,获取指定排名范围内的元素,注意最小值和最大值位置不能调换
ZRANGE [key] [min] [max]

# 按照score排序后,获取指定的score范围内的元素,注意最小值和最大值位置不能调换
ZRANGEBYSCORE [key] [min] [max]

# 求差集、交集、并集
ZDIFF/ZINTER/ZUNION [key1] [key2]

注意,所有的排序默认都是升序,如果要降序则在命令的Z后面添加REV即可


本节结束

本系列作品持续更新中~

  • 50
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值