Redis----REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value【键值对】存储系统(可以把redis想象成一个巨大的MAP)。
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis和ehcache不一样的是,ehcache可以看做一个嵌入式的缓存框架,而redis是一个独立的应用服务(像MYSQL一样),既可以提供缓存功能,还可以把数据持久化到磁盘上(redis也可以提供持久化的功能,在某些情况下,redis也可以作为数据库存在)。
Redis提供了一些丰富的数据结构,包括 lists, sets, ordered sets 以及 hashes ,当然还有 strings结构.Redis当然还包括了对这些数据结构的丰富操作。
Redis可以看成一个Map(key-value),在redis中,所有的KEY都可以理解为byte.(字节数组)
VALUE?在memcache中,value也只能是byte;------>Map
在redis中,value的可选类型很多,String,list,set,orderset,hash
Map
redis是一个key-value的内存存储应用(使用redis主要还是把数据存在内存中,这个可以最大的使用redis的性能优势);
redis可以把数据存储在内存中,也可以持久化到磁盘上;
redis不是一个适用于任何场景的存储应用;
理解:我们之前介绍数据库:关系型数据库、面向对象数据库、NoSQL(Not only SQL)—>(KEY-VALUE)内存数据库;redis不光可以作为一个缓存,他还是一个高效的内存数据库;可以在某些情况下,高效的替换到传统的关系型数据库,非常好的处理好高并发,高请求的场景.
SET KEY VALUE:把VALUE保存到redis中KEY对应的值;
GET KEY:取出redis中KEY对应的值;
1.Spring Data Redis框架
2.Spring Data Redis操作Redis中的String
redis中最常见的数据类型;内容可以是任何值(因为string对应着byte[]);
可以通过set key value添加一个值;
常见的字符串操作:
如果字符串的内容是数值(integer,在redis中,数值也是string)
1.incr key:在给定key的value上增加1;(常用于id);redis中的incr是一个原子操作,支持并发;如果key不存在,则相当于设置1;
2.incrby key value:给定key的value上增加value值;相当于key=key.value+value;这也是一个原子操作;
3.decr:在给定key的value上减少1;
4.decrby key value:给定key的value上减少value值;
string最常见的使用场景:
存储json类型对象
incr user:id
set user:1 {id:1,name:xiaolong}
incr user:id
set user:2 {id:2,name:stef}
作为计数器, incr count;
优酷视频点赞
incr vediogoodcount
decr vediogoodcount
3.Spring Data Redis操作Redis中的Set
SET结构和java中差不多,数据没有顺序,并且每一个值不能重复;
SET结构的常见操作:
1.SADD:给set添加一个元素
SADD language ‘java’
2.SREM:从set中移除一个给定元素
SREM language ‘php’
3.SISMEMBER:判断给定的一个元素是否在set中,如果存在,返回1,如果不存在,返回0
sismember language ‘php’
4.SMEMBERS:返回指定set内所有的元素,以一个list形式返回
smembers language
5.SCARD:返回set的元素个数
scard language
6.SRANDMEMBER key count:返回指定set中随机的count个元素
srandmember friends 3 //随机推荐3个用户(典型场景,抽奖)
7.SUNION(并集):综合多个set的内容,并返回一个list的列表,包含综合后的所有元素;
sadd language ‘php’
sadd pg ‘c’
sadd pg ‘c++’
sadd pgs ‘java’
sadd pgs ‘swift’
sunion language pg pgs
8.SINTER key [key …] (交集):获取多个key对应的set之间的交集
SINTER friends:user:1000 friends:user:1001 friends:user:1002
=>获取1000,1001,1002三个用户的共同好友列表;
9.SINTERSTORE destination key [key …] :获取多个key对应的set之间的交集,并保存为新的key值;目标也是一个set;
SINTER groupfriends friends:user:1000 friends:user:1001 friends:user:1002
=>获取三个用户共同的好友列表并保存为组好友列表;
set的使用场景:
1.去重;
2.抽奖;
1.准备一个抽奖池:sadd luckdraws 1 2 3 4 5 6 7 8 9 10 11 12 13
2.抽3个三等奖:srandmember luckdraws 3
srem luckdraws 11 1 10
3.抽2个二等奖:
3.做set运算(好友推荐)
1.初始化好友圈
sadd user:1:friends ‘user:2’ ‘user:3’ ‘user:5’
sadd user:2:friends ‘user:1’ ‘user:3’ ‘user:6’
sadd user:3:friends ‘user:1’ ‘user:7’ ‘user:8’
2.把user:1的好友的好友集合做并集;
user:1 user:3 user:6 user:7 user:8
3.让这个并集和user:1的好友集合做差集;
user:1 user:6 user:7 user:8
4.从差集中去掉自己
user:6 user:7 user:8
5.随机选取推荐好友
4.Spring Data Redis操作Redis中的List
redis的LIST结构(想象成java中的List),是一个双向链表结构,可以用来存储一组数据;从这个列表的前端和后端取数据效率非常高;
list的常用操作:
1.RPUSH:在一个list最后添加一个元素
RPUSH firends “stef”
2.LPUSH:在一个list最前面添加一个元素
LPUSH firends “stea”
3.LTRIM key start stop:剪裁一个列表,剩下的内容从start到stop;
LTRIM friends 0,3 =>只剩下前4个数据;
4.LRANGE key start stop:获取列表中的一部分数据,两个参数,第一个参数代表第一个获取元素的位置(0)开始,第二个值代表截止的元素位置,如果第二个参数为-1,截止到列表尾部;
LRANGE firends 0 -1
5.LLEN key: 返回一个列表当前长度
LLEND friends
6.LPOP:移除list中第一个元素,并返回这个元素
LPOP friends
7.RPOP:移除list中最后一个元素,并返回这个元素;
RPOP friends
使用场景:
1.可以使用redis的list模拟队列,堆栈
2.朋友圈点赞;
规定:朋友圈内容的格式:
1.内容: user❌post:x content来存储;
2.点赞: post❌good list来存储;
1.创建一条微博内容:set user:1:post:91 ‘hello redis’;
2.点赞:
lpush post:91:good ‘{id:1,name:stef,img:xxx.jpg}’
lpush post:91:good ‘{id:2,name:xl,img:xxx.jpg}’
lpush post:91:good ‘{id:3,name:xm,img:xxx.jpg}’
3,查看有多少人点赞: llen post:91:good
4,查看哪些人点赞:lrange post:91:good 0 -1
思考,如果用数据库实现这个功能,SQL会多复杂??
示例2:回帖
创建一个帖子:set user:1:post:90 ‘wohenshuai’
创建一个回帖:set postreply:1 ‘nonono’
把回帖和帖子关联:lpush post:90:replies 1
再来一条回帖:set postreply:2 ‘hehe’
lpush post:90:replies 2
查询帖子的回帖:lrange post:90:replies 0 -1
get postreply:2
5.Spring Data Redis操作Redis中的Map
hashes可以理解为一个map,这个map由一对一对的字段和值组成,所以,可以用hashes来保存一个对象:
hashes的常见操作:
1.HSET:给一个hashes添加一个field和value;
HSET user:1000 name “John Smith”
HSET user:1000 email “[email protected]”
HSET user:1000 password “s3cret”
2.HGET可以得到一个hashes中的某一个属性的值:
HGET user:1000 name =>“John Smith”
3.HGETALL:一次性取出一个hashes中所有的field和value,使用list输出,一个field,一个value有序输出;
HGETALL user:1000