一、Redis概述
在传统的java Web项目中,使用数据库存储数据。由于数据库持久化数据是面向磁盘的,而磁盘读写较慢,在存在大量并发访问的时候,比如抢购、秒杀场景,数据库难以承受极短时间内的成千上万次读写操作,极易造成系统瘫痪,最终导致服务器宕机。
为了解决这类问题,java Web项目旺旺引入NoSQL技术。NoSQL是一种简易的基于内存的数据库,并提供一定的持久化功能。Redis和MongoDB是当前使用最广泛的NoSQL技术。
Redis可以支持每秒十几万次的读写操作,性能远远超过数据库,并且支持集群、分布式、主从同步等配置,还支持一定的事务功能。
1、Redis性能优越的原因:
- Redis基于ANSI C语言编写,接近于汇编语言的机器语言,运行十分快速。
- Redis基于内存读写
- Redis数据结构只有5种基本类型,数据结构比较简单。
2、是否使用Redis存储应当考虑的因素:
- 业务数据是否常用。命中率如何。如狗命中率不高,没用必要写入缓存
- 该业务数据是读操作多还是写操作多。如果写操作读,需要频繁写入数据库,没必要使用缓存
- 业务数据大小如何。如果数据过大会给缓存带来压力。
2、Redis五大常用数据类型
Redis是一种基于内存的键值(key-value)数据库,使用key作为索引找到当前缓存的数据返回,Redis支持5种数据类型:STRING(字符串)、HASH(哈希散列表)、LIST(列表)、SET(集合)、ZSET(有序集合)。
(1)、STRING(字符串类型)
字符串是Redis最基本的数据结构,犹如java的map,以一个键一个值存储数据。
字符串类型基本命令:
命令 | 说明 | 备注 |
---|---|---|
set key value | 设置键值对 | 最常用的写入命令 |
get key | 通过键获取值 | 最常用的读取命令 |
del key | 通过key,删除键值对 | 删除命令,返回删除数,其他数据结构也可以使用 |
strlen key | 求key指向字符串的长度 | 返回长度 |
getset key value | 修改原来key的值,并将旧值返回 | 如果原来值为空,则返回空,并设置新值 |
getrange key start end | 获取子串 | start和end的取值范围为0 - len-1 |
append key value | 将value加入到原来key的字符串末 | 返回key指向新字符串的长度 |
(2)、HASH(哈希类型)
哈希类型结构也也如java的map,其value值是一个string类型的field和value的映射表,哈希类型特别适合用来存储对象。
hash结构基本命令:
命令 | 说明 | 备注 |
---|---|---|
hdel key field [field2 …] | 删除哈希结构中的某个或某些字段 | 可以进行多个字段的删除 |
hexists key field | 判断hash结构中是否存在field字段 | 存在返回1,不存在返回0 |
hgetall key | 获取该key对应的所有字段和值 | 返回键和值 |
hincrby key field increment | 指定给hash结构中的某一个字段加上一个整数 | 要求该字段也是整数字符串 |
hkeys key | 返回hash中所有的键 | |
hlen key | 返回hash中键值对数量 | |
hmget key field [ field2 … ] | 返回hash中指定的键的值,可以是多个 | 一次返回值 |
hmset key field1 value1 [ field2 value2 …] | hash结构设置多个键值对 | |
hset key field value | hash结构设置多个键值对 | 单个设值 |
hsetnx key field value | 当hash结构中不存在对应的键时,才设值 | |
hvals key | 获取hash结构中所有的值 |
(3)、LIST(链表类型)
双向链表结构,有序可重复,插入和删除便利,查询性能不佳。
链表的基本命令:
命令 | 说明 | 备注 |
---|---|---|
lpush key node1 [ node2 … ] | 在链表最左端插入node1 | 如果是插入多个,插入后从左到右的顺序是noden … node2 node1 |
rpush key node1 [ node2 … ] | 在链表最右端插入node1 | 如果是插入多个,插入后从左到右的顺序是node1 node2 … noden |
index key index | 读取下标为index的节点 | 返回节点字符串,从0开始算 |
llen key | 求链表的长度 | 返回链表节点数 |
lpop key | 删除链表最左端的节点,并将其返回 | |
rpop key | 删除链表最右端的节点,并将其返回 | |
linsert key before|after pivot node | 在值为pivot的节点前面或后面插入一个职位node的节点 | 如果list不存在,则报错;如果没有值为pivot的节点,则插入失败,返回-1 |
lpushx list node | 如果存在key为list的链表,则在链表最左端插入node | 如果list不存在,则失败 |
rpushx list node | 如果存在key为list的链表,则在链表最右端插入node | 如果list不存在,则失败 |
lrange list start end | 获取链表list从start下标到end下标的节点值 | 包含start 和end下标 的值 |
lset key index node | 设置列表下标为index的节点的值为node | |
ltrim key start stop | 修剪链表,只保留从start到stop的区间的节点,其余都删掉 | 包含start 和 end下标的节点会保留 |
链表的阻塞命令:
命令 | 说明 | 备注 |
---|---|---|
blpop key timeout | 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待时间超时或发现可弹出元素为止 | 相对于lpop命令,它的操作是进程安全的 |
brpop key timeout | 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待时间超时或发现可弹出元素为止 | 相对于rpop命令,它的操作是进程安全的 |
rpoplpush key src dest | 按从左到右的顺序,将一个链表的最后一个元素移除,并插入到链表的最左边 | 不能设置超时时间 |
brpoplpush key src dest timeout | 按从左到右的顺序,将一个链表的最后一个元素移除,并插入到链表的最左边,并可以设置超时时间 | 可设置超时时间 |
(4)、SET(集合类型)
Redis的集合类型不是一个线性结构,而是哈希表结构。对于redis集合的插入、删除和查找的复杂度都欧式O(1),注意集合元素无序不可重复,每一个元素都是String类型。
集合的基本命令:
命令 | 说明 | 备注 |
---|---|---|
sadd key member1 [ member2 … ] | 给键为key的集合增加成员 | 可以同时增加多个 |
srem key member1 [ member2 … ] | 移除集合中的元素 | 可以是多个 |
scard key | 统计键为key的集合的成员数 | |
sdiff key1 [ key2 ] | 找到两个集合的差集 | 参数如果是单key,则返回这个key的所有元素 |
sdiffstore des key1 [ key2 ] | 找到两个集合的差集,并保存到des集合中 | |
sinter key1 [ key2 ] | 求key1和key2的交集 | 参数如果是单key,则返回这个key的所有元素 |
sinterstore des key1 key2 | 找到两个集合的交集,并保存到des集合中 | |
sunion key1 [ key2 ] | 求两个集合的并集 | 参数如果是单key,则返回这个key的所有元素 |
sunionstore des key1 key2 | 找到两个集合的并集,并保存到des集合中 | |
sismember key member | 判断member是否是键为key的集合的成员 | 是返回1,否返回 0 |
smembers key | 返回键为key的集合的所有成员 | |
smove src des member | 将member元素从结合src转移到des中 | |
spop key | 随机弹出集合的一个元素 | |
srandmember key [ count ] | 随机返回集合中的count个元素 | count不填默认为1,如果count为负数则先求其绝对值,如果count大于集合总数,则返回整个集合 |
(5)、ZSET(有序集合类型)
有序集合与集合类似,主要区别是有序集合每一个元素除了值之外,还多了一个分数。分数是一个浮点数。有序集合元素不可重复,但分数可以一样。
有序集合基本命令:
命令 | 说明 | 备注 |
---|---|---|
zadd key score1 value1 [ score2 value2 … ] | 给键为key的有序集合增加成员 | 如果不存在对应的key,则创建键为key的有序集合 |
zscore key member | 返回成员的分数值 | |
srem key member1 [ member2 … ] | 移除集合中的元素 | 可以是多个 |
zcard key | 统计键为key的有序集合的成员数 | |
zcount key min max | 返回分数大于或等于min,小于或等于max的成员的值列表 | 若需要不包含min或max,在其前面加“(” |
zrank key member | 求有序集合中按从小到大顺序,member成员的排行 | 排名第一为0,排名第二为1… |
zrevrank key member | 求有序集合中按从大到小顺序,member成员的排行 | 排名第一为0,排名第二为1… |
其他求交集、差集、并集的命令可类比无序集合。