目录
Redis简介
1.1.什么是Redis
1.1.1Redis简介
Redis(Remote Dictionnary Server):即远程字典服务,是一个开源的、采用ANSI C语言编写,基于内存的且支持持久化,高性能的Key-Value的NoSQL数据库。Redis将数据写入内存,不需要通过i/o流读取数据,效率较高。
Redis官网:Redis
1.1.2NoSQL的概念
NoSQL(Not Only SQL):泛指非关系型的数据库,区别与关系数据库,它们不保证关系数据的ACID特性。
- 那什么是非关系型数据库?
要说非关系型数据库我们首先要了解什么是关系型数据库了,像MySQL就是一个典型的关系型数据库。我们知道,MySQL是一款数据库存储系统,我们操作的步骤是先建立数据库在建立表,表是由行和列组成的二维表格模型,在这个表中,列之间是存在关系的
如下图所示,一张user表
我们可以看到MySQL的一张表中,除了存储我们的数据之外,还维护者列与列,行与行之间的数据关系。
除此之外,我们知道表之间是存在关系的,一对一、一对多、多对多等。
在关系型数据库中,除了存储我们的数据之外,还很大程度上维护了我们数据之间的关系。
非关系数据库则不存储数据之间的关系,Redis正是非关系型数据库中的一款热门产品
1.2Redis的特点
在项目中使用Redis,主要是从两个角度去考虑,性能和并发,这是当前互联网发展过程中首要考虑的两个重难题。当然除去这两个要点之外,Redis还具备可以做分布式锁、任务队列等其他额外功能,此外Redis还易于扩展、支持丰富的数据类型存储
经官方性能测试Redis的读速度是110000次/s,写速度能够达到81000次/s。非常适用于当前高并发、高性能的实际业务场景
1.2.1性能
Redis是基于内存级别的缓存,这样使得请求能够快速从缓存中得到响应。相比传统请求数据库,响应速度大幅度提升。
但需要注意的是,引入了Redis后我们的项目架构将会发生一定的变化,如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这引入Redis之间的项目架构
引入Redis之后,项目架构的变化:
1.2.2并发
如下图所示 ,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用Redis做一个缓冲操作,并且redis支持高性能的主从复制的集群策略,这样大大提高满足高并发访问及快速响应。请求优先访问到redis请求数据,从而避免高并发情况下直接访问数据库
引入Redis之前的项目框架
引入Redis之后,项目框架的变化
此外,Redis支持丰富的数据结构,如:字符串(strings),散列(hashes),列表(list),有序集合(sorted sets)与范围查询,bitmaps,hyperloglogs和地理空间(geospatial)索引半径查询。
并且Redis丰富的支持主流语言的客户端,C、C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、JavaScript
二、Redis数据类型
2.1String数据类型
2.2.1String基本操作
- String类型数据结构如下:
- set:存数据
- 格式:
-
set key value
- 示例:
-
windowsServer:0>set name zhangsan ''ok'' windowsserver:0>
- get:取数据
- 格式:
-
get key
- 示例:
-
windowsServer:0>del name ''1'' WindowsServer:0>
- mset:一次性存储多个key
- 格式:
-
MSet key value[key value...]
- 语法:
-
windowsserver:0>mset a zhangsan b lisi c wangwu ''ok'' windowsserver:0>
- mget:一次性取多个key
- 格式:
-
mget key [key....]
- 语法:
-
WindowsServer:0>mget a b c 1) "zhangsan" 2) "lisi" 3) "wangwu" WindowsServer:0>
- strlen:获取字符个数
- 格式:
-
strlen key
- 语法:
-
WindowsServer:0>strlen a "8" WindowsServer:0>
- append:追加字符串(如果没有则新增)
- 格式:
-
append key value
- 语法:
-
WindowsServer:0>append a 88 "10" WindowsServer:0>
- setnx:存入key,如果这个key存在则返回0(false),代表存入失败,如果不存在则返回1(true),代表存入成功
- 格式:
-
setnx key value
- 语法:
-
WindowsServer:0>setnx flag 0 "1" WindowsServer:0>setnx flag 0 "0" WindowsServer:0>
2.2.2自增自减操作
- 自增:
- 语法:
-
incr key
- 格式 :
-
WindowsServer:0>set num 10 "OK" WindowsServer:0>incr num "11" WindowsServer:0>
- 控制步长自增
- 语法:
-
incrby key increment
- 格式:
WindowsServer:0>incrby num 10
"21"
WindowsServer:0>
- float类型自增:
- 格式:
-
incrbyfloat key increment
- 语法:
-
WindowsServer:0>set num2 0.5 "OK" WindowsServer:0>incrbyfloat num2 0.5 "1" WindowsServer:0>incrbyfloat num2 0.5 "1.5" WindowsServer:0>
- 自减
- 语法:
-
decr key
- 示例:
WindowsServer:0>set num 10
"OK"
WindowsServer:0>decr num
"9"
WindowsServer:0>decr num
"8"
WindowsServer:0>
- 控制步长自减:
- 语法:
-
decrby key increment
- 示例:
-
decrby a 10
2.2.3控制时效性
- 语法:
-
setex key seconds value #秒 psetex key milliseconds value #毫秒
- 示例:
-
WindowsServer:0>setex name 5 zhangsan "OK" WindowsServer:0>psetex name 5000 zhangsan "OK" WindowsServer:0>
2.2Hash数据类型
hash类型的存储结构如下:
hash类型的数据结构,底层采用hash表存储。
1.2.1hash基本操作
- hset:添加/修改数据
- 格式:
-
hset key field value
- 示例:
-
WindowsServer:0>hget user username 'zs' windowsServer:0>
- hdle:删除数据
- 格式:
-
hdel key field [field...]
- 示例:
-
WindowsServer:0>hdel user password "1" WindowsServer:0>
- hmset:一次性添加/修改多个字段
- 格式:
-
hmset key field value [field value...]
- 示例:
-
WindowsServer:0>hmset user username zs password admin age 20 "OK" WindowsServer:0>
- hmget:一次性取多个数据
- 格式:
-
hmget key field [field...]
- 示例:
-
WindowsServer:0>hmget user username password age 1) "zs" 2) "admin" 3) "20" WindowsServer:0>
- 获取指定key的field的数量
- 格式:
-
hlen key
- 示例:
-
WindowsServer:0>hlen user "3" WindowsServer:0>
- hexists:判断指定的key中是否包含有指定的field(返回1有或0没有)
- 格式:
-
hexists key field
- 示例:
-
WindowsServer:0>hexists user username "1" WindowsServer:0>hexists user xxx "0" WindowsServer:0>
-
1.2.2hash扩展操作
- hkeys:获取key中所有的field
- 格式:
-
hkeys key
- 示例:
-
WindowsServer:0>hkeys user 1) "username" 2) "password" 3) "age" WindowsServer:0>
- hvals:获取key中所有的value
- 格式:
-
hvals key
- 示例:
-
WindowsServer:0>hvals user 1) "zs" 2) "admin" 3) "20" WindowsServer:0>
- hgetall:获取指定key中所有的field以及value值
- 格式:
-
hgetall key
- 示例:
-
WindowsServer:0>hgetall user 1) "username" 2) "zs" 3) "password" 4) "admin" 5) "age" 6) "20" WindowsServer:0>
- hsetnx:如果指定key中有对应的field则返回0(false),如果没有则存对应的值进去
- 格式:
-
hsetnx key field value
- 示例:
-
WindowsServer:0>hsetnx user flag 1 "1" WindowsServer:0>hsetnx user flag 1 "0" WindowsServer:0>
-
2.3List数据类型
- 在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均2被移除,那么该键也将会被从数据库中删除。Redis中的list类型采用的是双向链表。
- Redis存储结构如下:
-
2.3.1list基本操作
- 添加/修改数据;
- 格式
-
lpush key value [value....] #添加到队列左侧 rpush key value [value....] #添加到队列右侧
- 示例
-
WindowsServer:0>lpush fruits apple pear "2" WindowsServer:0>rpush fruits banana tomato "4" WindowsServer:0>
- fruits链表的变化如下:
- 获取数据:
- 格式:
-
lrange key start stop #从左边开始读取数据,从start索引查询到stop索引
- 示例:
-
WindowsServer:0>lrange fruits 0 3 # 从0开始查询到3索引 1) "pear" 2) "apple" 3) "banana" 4) "tomato" WindowsServer:0>lrange fruits 0 -2 # 从0开始查询到-2索引 1) "pear" 2) "apple" 3) "banana" WindowsServer:0>lrange fruits 0 -1 # 从0开始查询到-1索引(倒数第二),通常用此命令来查询全部数据 1) "pear" 2) "apple" 3) "banana" 4) "tomato" WindowsServer:0>
- 根据指定的索引查询(从0开始)
- 格式:
-
lindex key index
- 示例:
-
WindowsServer:0>lindex fruits 3 "tomato" WindowsServer:0>
Tips:lindex不支持反向查询
- 获取并移除数据
- 格式:
-
lpop key #从队列左边移除一个元素并返回 rpop key #从队列右边移除一个元素并返回
- 示例:
-
WindowsServer:0>lpop fruits "pear" WindowsServer:0>rpop fruits "tomato" WindowsServer:0>
-
2.3.2list扩展操作
- 规定时间内获取并移除数据
- 格式:
-
blpop key [key...] timeout # 在timeout时间内取出key中的值 brpop key [key...] timeout
- 示例:
-
WindowsServer:0>blpop fruits 3 1) "fruits" 2) "apple" WindowsServer:0>blpop fruits 3 1) "fruits" 2) "banana" WindowsServer:0>blpop fruits 3 # 3秒内取出fruits中的值并删除,如果没取到则一直处于等待状态 WindowsServer:0>
- 规定时间内移除lish右边的一个元素到另一个list的左边,并将此元素返回
- 格式:
-
brpoplpush source destination timeout
- 示例:
-
WindowsServer:0>flushdb # 清空数据库 "OK" WindowsServer:0>lpush fruits apple "1" WindowsServer:0>lpush fruits pear "2" WindowsServer:0>brpoplpush fruits temp 3 "apple" WindowsServer:0>lrange temp 0 -1 1) "apple" WindowsServer:0>brpoplpush fruits temp 3 "pear" WindowsServer:0>lrange temp 0 -1 1) "pear" 2) "apple" WindowsServer:0>lrange fruits 0 -1 # fruits链表中已经没有了数据 WindowsServer:0>
- 移除指定数据
- 格式:
-
lrem key count value #从list左边开始移除元素
-count:移除多少个
- value:移除什么元素
- 示例:
-
WindowsServer:0>rpush data a b c d e a b c k o "10" WindowsServer:0>lrange data 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" 6) "a" 7) "b" 8) "c" 9) "k" 10) "o" WindowsServer:0>lrem data 2 a "2" WindowsServer:0>lrange data 0 -1 1) "b" 2) "c" 3) "d" 4) "e" 5) "b" 6) "c" 7) "k" 8) "o" WindowsServer:0>
-
2.4Set数据类型
- 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间是常量时间。Set可包含的最大元素数是4294967295。
- 和List类型不同的是,Set集合中不允许出现重复的元素。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如sinter、sdiff、sunion等操作。由于这些操作均在服务端完成, 因此效率极高,而且也节省了大量的网络IO开销
-
2.4.1set基本操作
- 添加数据:
- 格式:
-
sadd key member [member...]
- 示例:
-
WindowsServer:0>sadd cities changsha wuhan nanchang hefei hangzhou fuzhou "6" WindowsServer:0>
- 读取全部数据
- 格式:
-
smembers key
- 示例:
-
WindowsServer:0>smembers cities 1) "nanchang" 2) "wuhan" 3) "changsha" 4) "hefei" 5) "hangzhou" 6) "fuzhou" WindowsServer:0>
- set 存取无序
- 删除数据
- 格式:
-
srem key member [member...]
- 示例:
-
WindowsServer:0>srem cities fuzhou hangzhou "2" WindowsServer:0>smembers cities 1) "changsha" 2) "nanchang" 3) "hefei" 4) "wuhan" WindowsServer:0>
- 获取集合中元素的个数
- 格式:
-
scard key
- 示例:
-
WindowsServer:0>scard cities "4" WindowsServer:0>
- 判断集合中是否包含指定的数据
- 格式
-
sismember key member
- 示例:
-
WindowsServer:0>sismember cities nanchang "1" WindowsServer:0>
-
2.4.2set扩展操作
- 移动集合中的指定元素到另一个集合
- 格式:
-
smove source destination member
- 示例:
-
WindowsServer:0>sadd fruits1 apple pear "2" WindowsServer:0>sadd fruits2 banana tomato "2" WindowsServer:0>smove fruits1 fruits2 apple (integer) 1 WindowsServer:0>smembers fruits1 1) "pear" WindowsServer:0>smembers fruits2 1) "apple" 2) "banana" 3) "tomato"
- 在指定的key中随机获取几个值
- 格式:
-
srandmember key [count]
- 示例:
-
WindowsServer:0>srandmember cities 2 1) "hefei" 2) "changsha" WindowsServer:0>
- 在指定的key中随机获取几个值,并将这几个值移除
- 格式:
-
spop key [count]
- count默认为1
- 示例:
-
WindowsServer:0>spop cities "hefei" WindowsServer:0>smembers cities 1) "changsha" 2) "nanchang" 3) "wuhan" WindowsServer:0>spop cities 2 1) "changsha" 2) "wuhan" WindowsServer:0>smembers cities 1) "nanchang" WindowsServer:0>
-
2.4.3交集差集并集
- 取两个集合的交集
- 格式:
-
sinter key [key...] #交集
- 示例:
-
WindowsServer:0>sadd cities1 lanzhou guangzhou fuzhou hangzhou zhengzhou "5" WindowsServer:0>sadd cities2 meizhou guangzhou quanzhou fuzhou ganzhou "5" WindowsServer:0>sinter cities1 cities2 1) "guangzhou" 2) "fuzhou" WindowsServer:0>
- 取两个集合的差集
- 格式:
-
sdiff key [key...] #差集
- 示例:
-
WindowsServer:0>sdiff cities1 cities2 1) "zhenghzhou" 2) "hangzhou" 3) "lanzhou" WindowsServer:0>
- 取两个集合的并集:
- 格式:
-
sunion key [key...] #并集
- 示例:
-
WindowsServer:0>sunion cities1 cities2 1) "quanzhou" 2) "meizhou" 3) "zhenghzhou" 4) "lanzhou" 5) "guangzhou" 6) "hangzhou" 7) "fuzhou" 8) "ganzhou" WindowsServer:0>
- 获取两个集合的交、差、并集存储到指定集合中
- 格式:
-
sinterstore destination key1 [key2] #交集 sdiffstore destination key1 [key2] #差集 sunionstore destination key [key2] # 并集
- sinterstore-案例
-
WindowsServer:0>sinterstore sinter_temp cities1 cities2 "2" WindowsServer:0>smembers sinter_temp 1) "guangzhou" 2) "fuzhou" WindowsServer:0>
- sdiffstore-案例
-
WindowsServer:0>sdiffstore sdiff_temp cities1 cities2 "3" WindowsServer:0>smembers sdiff_temp 1) "zhenghzhou" 2) "hangzhou" 3) "lanzhou" WindowsServer:0>
- sunionstore-案例
-
WindowsServer:0>sunionstore sunion_temp cities1 cities2 "8" WindowsServer:0>smembers sunion_temp 1) "quanzhou" 2) "meizhou" 3) "zhenghzhou" 4) "lanzhou" 5) "guangzhou" 6) "hangzhou" 7) "fuzhou" 8) "ganzhou" WindowsServer:0>
-
Sorted_set数据类型
-
sorted_set基本操作
- 添加数据:zadd
-
zadd key score1 member1 [score2 member2]
- 读取数据:zrange/zrevrange
-
zrange key start stop [WITHSCORES] zrevrange key start stop [WITHSCORES]
- 根据分值筛选:zrangebyscore/zrevrangebyscore
-
zrangebyscore key min max [WITHSCORES] [LIMIT offset count] zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]
- sorted_set其他操作
- 根据分值范围查询集合总数量:zcount
- 取多个集合中的交集、并集:zinterstore/zunionstor