赞
踩
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样:
大部分程序员应该都不会对Redis的STRING、LIST、HASH这3种结构感到陌生,因为它们和很多编程语言内建的字符串、列表和散列等结构在实现和语义(semantics)方面都非常相似。有些编程语言还有集合数据结构,在实现和语义上类似于Redis的SET。ZSET在某种程度上是一种Redis特有的结构,但是当你熟悉了它之后,就会发现它也是一种非常有用的结构。下表对比了Redis提供的5种基本类型,说明了这些结构存储的值,并简单介绍了它们的语义。
Redis为了方便我们学习,将操作不同数据类型的命令也做了分组,在官网( https://redis.io/commands )可以查看到不同的命令:
也可以通过 redis-cli 客户端查看帮助文档:
我们可以去官方网站上面查找Redis的通用命令:
也可以通过 redis-cli 客户端查看Redis的通用命令:
通用指令是部分数据类型的,都可以使用的指令,常见的有:
通过help [command] 可以查看一个命令的具体用法,例如:
redis的模板(patterns)学习:
KEYS命令示例:
语法:
示例:
语法:
示例:
语法:设置的这个KEY必须事先创建好
示例:
语法:
示例:
如果key
设置了有效期,并且没有过期,则TTL
命令可以查看该key
的剩余有效期。
String类型,也就是字符串类型,是Redis中最简单的存储类型。 其value是字符串,不过根据字符串的格式不同,又可以分为3类:
不管是哪种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m.
String的常见命令有:
语法:
示例:
语法:
示例:
语法:
示例:
语法:
示例:
语法:
示例:
语法:
示例:
语法:
示例:
语法:
示例:
语法:
示例:
Redis的key允许有多个单词形成层级结构,多个单词之间用 :
隔开,格式如下:
这个格式并非固定,也可以根据自己的需求来删除或添加词条。 例如我们的项目名称叫 heima,有user和product两种不同类型的数据,我们可以这样定义key:
如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:
示例:
set codejiao:user:1 '{"id":1, "name":"Jack", "age": 21}'
set codejiao:user:2 '{"id":1, "name":"Jack", "age": 21}'
创建结果:
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
Redis的散列键会将一个键和一个散列在数据库里关联起来,用户可以在散列中为任意多个字段(field)设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。
通过使用散列键,用户可以把相关联的多项数据存储到同一个散列里面,以便对这些数据进行管理,或者针对它们执行批量操作。下图就展示了一个使用散列存储文章数据的例子,在这个例子中,散列的键article::10086,而这个键对应的散列则包含了4个字段,其中:
因此Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD
Hash的常见命令有:
HSET key field value:添加或者修改hash类型key的field的值
HGET key field:获取一个hash类型key的field的值
HMSET:批量添加多个hash类型key的field的值
HMGET:批量获取多个hash类型key的field的值
HGETALL:获取一个hash类型的key中的所有的field和value
HKEYS:获取一个hash类型的key中的所有的field
HVALS:获取一个hash类型的key中的所有的value
HINCRBY:让一个hash类型key的字段值自增并指定步长
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
添加或者修改hash类型key的field的值
语法:
示例:
获取一个hash类型key的field的值
语法:
示例:
批量添加多个hash类型key的field的值
语法:
示例:
批量获取多个hash类型key的field的值
语法:
示例:
获取一个hash类型的key中的所有的field和value
语法:
示例:
获取一个hash类型的key中的所有的filed
语法:
示例:
获取一个hash类型的key中的所有的value
语法:
示例:
让一个hash类型key的字段值自增并指定步长
语法:
示例:
添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
语法:
示例:
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。 特征也与LinkedList类似:
常用来存储一个有序数据,例如:朋友圈点赞列表,评论列表等。
常用命令:
向列表左侧插入一个或多个元素
语法:
示例:
如果users
不存在则会创建一个List
类型的users
移除并返回列表左侧的第一个元素,没有则返回nil
语法:
示例:
向列表右侧插入一个或多个元素
语法:
示例:
移除并返回列表右侧的第一个元素
语法:
示例:
返回一段角标范围内的所有元素
语法:
示例:
与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil,这里就不演示了
语法:
如何利用List结构模拟一个栈?
如何利用List结构模拟一个队列?
如何利用List结构模拟一个阻塞队列?
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
redis的集合(set)键允许用户将任意多个各不相同的元素存储到集合中,这些元素既可以是文本数据,也可以是二进制数据。虽然列表键也允许我们存储多个元素,但集合与列表有以下两个明显的区别:
这两个区别带来的差异主要跟命令的复杂度有关:
因此当我们需要存储多个元素时,就可以考虑这些元素是否可以以无序的方式存储,并且是否不会出现重复,如果是,那么就可以使用集合来存储这些元素,从而有效地利用集合操作的效率优势。
Set类型常用命令有:
向set中添加一个或多个元素
语法:
示例:
移除set中的指定元素
语法:
示例:
返回set中元素的个数
语法:
示例:
判断一个元素是否存在于set中
语法:
示例:
获取set中的所有元素
语法:
示例:
求key1与key2的交集
语法:
示例:
求key1与key2的差集
语法:
示例:
求key1与key2的并集
语法:
示例:
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
SortedSet具备下列特性:
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能
SortedSet类型常用命令:
注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
添加一个或多个元素到sorted set ,如果已经存在则更新其score值
语法:
示例:
删除sorted set中的一个指定元素
语法:
示例:
获取sorted set中的指定元素的score值
语法:
示例:
获取sorted set 中的指定元素的排名
语法:
示例:
获取sorted set中的元素个数
语法:
示例:
统计score值在给定范围内的所有元素的个数
语法:
示例:
准备测试数据:
开始测试:
让sorted set中的指定元素自增,步长为指定的increment值
语法:
示例:
按照score排序后,获取有序集合中获取指定索引范围内的成员
语法:
示例:
按照score排序后,获取指定score范围内的元素
语法:
示例:
ZDIFF、ZINTER、ZUNION:求差集、交集、并集
语法:
示例:
由于Set类型做过详细的测试,所以这里就不做具体的测试了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。