前言:为什么要学Redis?
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message broker. 翻译为:Redis是一个开源的内存中的数据结构存储系统,它可以用作:数据库、缓存等。
官网:https://redis.io
中文网 Redis中文网
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供的数据是可以达到10万+的QPS(Queries-per-second每秒内查询次数)。它存储的value类型比较丰富,也被称为结构化的NoSql数据库。
Redis是一个基于内存的key-value结构数据库。它是「Remote Dictionary Service」的首字母缩写,也就是「远程字典服务-remote dictionary server」
redis具有以下优点:
1.基于内存存储,读写性能高。
2.适合存储经常访问的数据。
3.企业开发中常用作缓存
Redis的数据类型
Redis是一种高级的key-value的存储系统,其中key(键)是String类型,value支持5种数据类型即:String,hash,list,set,zset。
关于key(键)的数据类型有以下规则:
1.键不能重复
2.键的作用是用来标识存储的数据
3.数据类型:String
4.命名规则:
1)不能太长:因为查询的效率低,查询起来不方便
2)不能太短:容易重复,同时可读性也差
一:value的第一种数据类型:String
更多命令可以参考Redis中文网:Redis中文网
字符串类型是Redis中最为基础的数据存储类型,它在Redis中以二进制保存。无论存入的是字符串、整数、浮点类型都会以字符串写入。String为value时,最大存储容量为512M
String的常用命令如下:
命令 | 功能 |
set 键 值 | 添加或修改一个键和值,键不存在就是添加,存在就是修改 |
get 键 | 获取值,如果存在就返回值,不存在返回nil(就是C语言中NULL) |
del 键 | 删除指定的键和值,返回删除的个数 |
SETEX key seconds value | 设置指定key的值,并将 key 的过期时间设为 seconds 秒。此处的value是指key对应的value值。等价于:SET key value ex seconds |
EXPIRE key seconds | 如果一个key已经存在,要设置一个过期时间 |
SETNX key value/set key value nx | 保存键值对,如果key存在则不保存,不存在则保存 |
补充:
批量操作:
mset name lisi addr sh
mget name age addr
del name age
String作为value的常见的使用场景:
- 用户登录后端保存短信验证码,并设置失效时间;
- 代替后端session功能,实现分布式缓存(是将数据分散存储在多台独立的设备上)等;
二:value的第二种数据类型:hash
可以将hash理解为在JavaSE学习的map一样,hash作为value时,最大存储容量为:4G个键值对
hash的常用指令如下:
命令 | 功能 |
hset 键 字段 值 | 添加键,字段,值 |
hget 键 字段 | 通过键,字段得到值 |
hmset 键 字段 值 字段 值 | multiply多个,一次添加多个字段和值 |
hmget 键 字段 字段 | 通过键,获取多个字段和值 |
hdel 键 字段 字段 | 删除一个或多个字段的值 |
hgetall 键 | 得到这个键下所有的字段和值 |
HKEYS 键 | 获取哈希表中所有字段 |
HVALS 键 | 获取哈希表中所有值 |
例如:创建hash类型的键为person,并且添加一个字段为name,值为zhangsan
命令:hset persion name zhangsan
hash的常用场景:
存储有对象数据的,例如购物车,一个用户对应一个ID号,一个产品可以定义为一个字段值,该产品又可以选择多个数量(1,2,3.....)
三:value的第三种数据类型:list
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其左部(left)和右部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4G个。
list常用命令:
命令 | 行为 |
lpush 键 元素 元素... | left 从左边向指定的键中添加1个或多个元素,返回列表中元素的个数 |
rpush 键 元素 元素... | right 从右边向指定的键中添加1个或多个元素 |
lpop 键 | 从左边删除一个元素,返回被删除的元素 |
rpop 键 | 从右边删除一个元素,返回被删除的元素 |
lrange 键 开始 结束 | 得到键中指定范围的元素的数据 每个元素都有一个索引号,从左向右0~n 从右向左索引号:-1~-(n+1),每个元素有2个索引号 如果要取出整个列表中所有的元素,索引号应该是:0~-1 |
lindex 键 索引值 | 查询指定索引的元素 |
llen 键 | 获取列表的长度 |
BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止,超时时间单位默认是秒 |
LREM key 删除元素个数 value值 | 从表头删除指定个数的元素 |
list的图示:
list的常用场景:
1.常用于点赞系列
2.list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名等
四:value的第四种数据类型:set
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。Set可包含的最大元素数量是4G,和List类型不同的是,Set集合中不允许出现重复的元素。
set常用命令:
命令 | 行为 |
sadd 键 元素 元素... | 向一个键中添加1个或多个元素 |
smembers 键 | 得到这个集合中所有的元素 |
sismember 键 元素 | 判断指定的元素在集合中是否存在,存在返回1,不存在返回0 |
srem 键 元素 元素... | 通过键删除一个或多个元素 |
sinter key1 [key2] | 返回给定所有集合的交集(集合中都共有的部分) |
set常用场景:
1.存入一列数据,自动去重,且不需要排序,可以用来做身份证信息、手机号码等作为黑名单|白名单
2.因为是无序的,所以可以用来做抽奖系统
3.共同好友查询,使用set
五:value的第五种数据类型:zset
Redis 有序集合(sorted set)和set集合一样也是无序不可以重复。不同的是每个元素都会关联一个分数(排序因子)。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复,每个集合可存储40多亿个成员。
zset的常用命令:
命令 | 行为 |
zadd 键 分数 值 分数 值 | 添加1个或多个元素,每个元素都有一个分数 |
zrange 键 开始索引 结束索引 | 获取指定范围的元素,得到所有的元素,索引是0到-1 |
zrange 键 开始索引 结束索引 withscores | 查询指定的元素和对应的分数 |
zrevrange 键 开始索引 结束索引 withscores | 按照分数倒叙获取指定的元素和对应的分数 |
zrem 键 值 值 | 删除一个或多个值 |
zcard 键 | 得到元素个数 |
zrank 键 值 | 得到元素的索引号 |
zscore 键 值 | 得到元素的分数 |
zset的图示:
zset的常用场景:
因为通过分数来排序,故可以用来点赞排名,或者新浪微博热搜排名等
六:Redis的其他操作
以下操作命令也可以用来操作redis的其他操作,如下:
命令 | 功能 |
keys 匹配字符 | 查询所有的键,可以使用通配符 * 匹配多个字符 ? 匹配1个字符 |
del 键1 键2 | 删除任何的值类型,而且可以同时删除多个键 |
exists 键 | 判断指定的键是否存在,不存在返回0 存在返回1 |
type 键 | 判断指定的键,值的类型。返回是类型的名字 |
select 数据库编号 | 选择其它的数据库 |
move 键 数据库编号 | 将当前数据库中指定的键移动到另一个数据库中 |
TTL key | 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位 从Redis2.8开始:如果key不存在或者已过期,返回-2;如果key存在并且没有设置过期时间(永久有效),返回-1 |
flushall | redis的flushall命令用来清空redis所有的库,测试可以使用,开发中最好不要用。 |
因此,基于以上的一些命令是操作redis的基础命令,同时redistribution,还具有以下优点
1. 高性能: Redis是基于内存的存储系统,读写速度非常快,可以达到数十万次/秒的读写性能。
2. 数据持久化: Redis支持数据持久化,可以将数据保存到磁盘上,以防止系统重启或崩溃时数据丢失。
3. 支持多种数据结构: Redis支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,方便存储不同类型的数据。
4. 分布式: Redis支持分布式部署,可以将数据分布在多个节点上,提高系统的扩展性和负载均衡能力。
5. 支持事务: Redis支持事务操作,可以将多个操作放在一个事务中进行,保证操作的原子性。
6. 发布订阅: Redis支持发布-订阅模式,可以实现消息的发布和订阅,方便实现实时通信和消息传递。
7. 简单易用: Redis具有简单的命令和丰富的客户端库,使用起来非常方便。
8. 社区活跃: Redis拥有庞大的开源社区,有很多的第三方库和工具可以使用,可以快速解决问题。