1.redis数据结构:
String(字符串类型)
list(链表)
hash(哈希表类型)
set(无序的集合)
sorted set(有序集合,缩写为zset)。
Redis的特点
1)高速读取数据(in-memory)
2)减轻数据库负担
3)有集合计算功能(优于普通数据库和同类别产品)
4)多种数据结构支持
redis 支持数据持久化和内存存储两种方式
Redis的数据类型和管理命令
1.Redis的String数据类型
string是redis最基本的类型
redis的string可以包含任何数据。包括jpg图片或者序列化的对象。
单个value值最大上限是1G字节。memcache单个value存储1M。
如果只用string类型,redis就可以被看作加上持久化特性(服务器重启之后,数据不丢失)的memcache
(1)set命令
该命令用于设置或者修改Redis中的键值(这个功能于Memcache的set有点类似) 命令语法:set 键名(key) 值(value)
例如:我们添加一个name=“itheima”的键值对。
例如:我们修改name为xiaoqian
注意:在redis当中默认使用set那么会永久存储在硬盘和内存当中,使用redis快照的方式进行存储的,redis的string类型没有所谓的过期时间命令,过期时间的命令属于服务器的key类型
(2)get命令
该命令用于获取Redis中key对应的string值,如果key不存在返回 nil,
命令语法:get 键名
获取一个已经存在的键名,可以得到该键名的值
如果一个键名不存在,那么获取该键名会返回nil
Redis的hash数据类型
(1)hset命令(hash set)
命令的功能:在哈希表中设置一个字段(field)和 一个字段的值(value)
命令格式: hset 哈希表的名称 字段(field) 字段值(value)
例如:存储一个名为Jay:star,字段为name,age和jober的哈希表数据,如下:
(2)hget命令
命令的功能:在一张指定的哈希表中获取字段的值,如果字段不存在那么将返回nil
命令格式: hget 哈希表的名称 字段(field)
例如:获取一张名为Jay:star的哈希表中获取姓名和年龄,代码如下所示:
以上使用hset和hget我们获取和设置哈希表的要一个一个的进行,比较没有效率,假设我们要一次设置多个哈希表的字段和值,那么我们应该怎么做呢?
(3)hmset命令
命令的功能:在哈希表中设置多个字段(field)和 多个字段的值(value)
命令格式: hmset 哈希表的名称 字段(field) 字段值(value)….
例子:存在一张名为itcast:gz的哈希表,字段有php,java,ui,php字段对应的值是laravel,java字段对应的值ssh,ui字段对应的值是photoshop
使用命令设置如下所示:
使用hgetall命令执行效果如下:
(4)hgetall命令
命令的功能:在哈希表获取所有的字段和值
命令格式: hgetall 哈希表的名称
例如:获取一个表名为Foods:Fruit的哈希表中的所有字段和值,代码如下所示:
hgetall Foods:Fruit
假设要获取Users:Jay,那么语句如下:
hset和hget的应用的范围如下:
①如果我们需要修改itcast:gz中的php为thinkphp3.2.3,我们应该如做呢?这时只能使用hset命令进行修改:
①如果我们需要修改itcast:gz中的php为thinkphp3.2.3,我们可以用hget直接查看php字段修改的结果:
3.Redis的list链表数据类型
链表数据结构中的栈:先进后出的特点,其原理图如下:
链表数据结构中的队列:先进先出
(1)lpush命令(跟栈相关)
命令的功能:在链表的栈中由头部压入一条数据
命令格式: lpush 链表的名称(栈名称) 值
命令如下:
例子:在一个名为list1的栈中压入数据one,two,three
以上分别在栈中头部压入的顺序为one,two,three,如下图所示
(2)rpush命令(跟队列相关)
命令的功能:在链表的队列中由尾部压入一条数据
命令格式: rpush 链表的名称(队列) 值
命令如下:
例子:在一个名为list2的队列中插入数据one,two,three
以上分别在队列中尾部压入的顺序为one,two,three,如下图所示
(3)lrange命令(跟队列和栈都相关,用于查询)
命令的功能:在链表的中获取一个范围的数据
命令格式: lrange 链表的名称 索引开始位置 索引结束位置(-1代表获取到全部)
例如:获取一个栈的所有数据,比如获取list1的链表中所有栈的数据
如图所示:
例如:获取一个队列list2的所有数据
例如:获取一个队列list2中开始位置为0,结束位置为1的数据
例如:获取一个栈list1中开始位置为1一直到最后的数据
lpop命令(与栈和队列相关)
命令的功能:弹出队列中的头部元素或者弹出栈中的头部元素,并且返回其值
命令格式: lpop 链表的名称
例子1:弹出list1栈中的头部元素
例子2:弹出list2队列中的头部元素
ltrim命令(一般用于队列操作比较多)
命令的功能:让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
命令格式: ltrim 链表的名称 开始的位置 结束的位置
现在有一个队列叫list3,其元素如下所示:
如果我们希望保存two,three,four区间的值,其他都删除,那么我应该怎么做?我们就需要使用ltrim命令:
我们知道two的索引为1,而four的索引为3,所以我们要保留的区间数据范围就索引1-3,因此编写命令如下:
如果我们需要把one,four,five保留其他都删除,是否可以做到呢?这样的区间保留队列是无法实现,所以这种需求是错误的
Redis的Set集合数据类型(无序集合)
在现实开发当中集合一般用于社交网站或者社交软件的朋友圈功能(例如:新浪微博好友圈),如下图所示:
在现实的社交网站开发当中存在着一个好友推荐的功能,这个就是把一个用户有朋友而另一个用户没有的朋友推荐,在redis当中这种功能可以使用集合中求差集的方法进行实现
差集的定义:一个集合存在某一个元素,而另外一个集合不存在的元素,该元素就属于两个集合的差集
交集的定义:一个集合和另外一个集合共同的元素,称为交集,在现实开发当中就是社交网站的共同好友功能
并集的定义:一个集合和另外一个集合进行合并然后去除重复的元素后所得到的结果就是并集,在实际开发当中并集的使用就是为了共享,游戏行业中的道具共享就是并集的结果
(1)sadd命令(set add)
命令的功能:在无序集合当中添加一个元素,该元素如果存在该元素不会被重复添加
命令格式: sadd 集合的名称 集合的元素
例子1:创建一个名为zsf的无序集合,含有元素杨过,小龙女,林朝英
例子2:创建一个名为lsf的无序集合,含有元素周伯通,杨过,洪七公
smembers命令
命令功能:查看一个无序集合中的所有的元素
命令格式: smembers [无序集合的名称]
例子:分别查看zsf和lsf的元素
sdiff命令(好友推荐功能)
命令的功能:以一个集合作为标准去求另外一个集合不存在的元素,我们称为差集(可以参考集合概念中差集的图片辅助理解)
命令格式: sdiff 作为标准的集合名称 求差集的集合名称
例子1:以张三作为标准求李四的差集
例子2:以李四作为标准求张三的差集
sinter命令
命令的功能:一个集合和另外一个集合共同的元素,我们称为交集(可以参考集合概念中交集的图片辅助理解)
命令格式: sinter 集合名称1 集合名称2
例子:求出张三和李四的共同好友
sunion命令
命令的功能:求出两个集合合并后所有的元素并去掉重复的元素的结果称为并集(可以参考集合概念中并集的图片辅助理解)
命令格式: sunion 集合名称1 集合名称2
比如:把张三的朋友和李四的朋友合并在一起进行群聊功能就可以使用以下命令:
scard命令
命令的功能:统计集合中的元素个数,并返回总数的整型值
命令格式: scard 集合名称
比如:希望知道张三或者李四有多少个好朋友,那么就可以使用该命令:
Redis的Zset集合数据类型(有序集合)
sorted set是set的一个升级版本,意大利文叫zset,在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。有序列表值完成的是集合元素排序的功能,一般很少用于其他方向。
zadd 命令
命令功能:向有序集合中添加元素。如果该元素存在,则更新其顺序。
在zset当中序号是顺序,索引号是下标,注意区分
命令格式: zadd 集合名 序号 元素
比如:我们定义一个明星的社区,明星有排名,人气最高的明星排名第1杨幂,排名2鹿晗,排名3迪丽热巴,排序取决你的自定义顺序
1,2,3叫序号,不叫索引号,yangmi的序号是1,而索引号是0
zrange命令
命令功能:按序号升序(由小到大)获取有序集合中的内容
命令格式:zrange 集合名称 开始位置(索引) 结束位置(索引)(-1获取全部)
比如:获取stars当中所有有序集合中的元素,用升序进行排列
如果我们希望yangmi排dilireba之后,我们就需要修改yangmi的序号排名,比如让yangmi排第99位,依然使用zadd就可以完成这个功能,在redis中,如果zadd添加的元素已经存在,那么会更新当前元素的序号
比如:添加yangmi作为stars的元素,其序号为99,那么yangmi的序号就会被更新
修改后结果如下:
(3)zrevrange命令
命令功能:按序号降序(由大到小)获取有序集合中的内容。
命令格式:zrevrange 集合名称 开始位置(索引) 结束位置(索引)(-1获取全部)
比如:获取stars当中所有有序集合中的元素,用降序序进行排列
在一个叫做明星社区当中,有时候排名是按照粉丝数进行排名的,比如:邓超(4000),孙俪(3000),杨幂(1500),粉丝数作为排序的依据
五.Redis中与Key相关的命令
(1)keys * 命令
命令功能:返回当前数据库里面的键(key)
(2)exists命令
命令功能:判断一个键是否存在。
命令格式:exists 键名
比如:我们在网站中希望添加周杰伦的相关明星信息更新,但是我们需要直到周杰伦是否已经录入,这时我们可以使用exists命令
比如,我们查询林志玲的信息是否存在
如果返回0代表该键名不存在,如果返回1代表键名存在
(3)del
命令功能:删除指定的键(key),如果返回1代表删除键名成功,返回0代表删除失败
命令格式:del 键名
删除成功查看itcast:gz的键名则无法查询其内容
(4)expire
命令功能:设置键的有效期,如果不调用该命令设置键名,默认的情况下键名本身就是永远不过期。
命令格式:expire 键名 有效期(秒数)
比如:设置key为name的值15秒后过期,我们可以使用expire命令
如果时间到了,我们查询就返回nil:
如果我们现在设置了一个key在5分钟后过期(300秒),现在距离过期的时间还有多长,我们需要实时把握告诉用户,我们应该怎么做呢?只需用一个叫ttl的命令
(5)type
命令功能:返回一个键的数据类型
命令格式: type 键名