本篇博客目的:
学习了解redis是什么?能干什么?怎么在linux上安装并使用,作出对常用的数据类型的讲解和应用场景的描述。
相信大多数企业和公司都会用到redis数据库,当然我们主要是用它来做缓存比较多下面附图一张,说明一下它在项目中的位置,然后本篇博客系统的学习 一下redis这个组件。
简单官方的概述一下:
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、nosql数据库。
要想知道这个也不难,但是具体什么原因呢?我们可以通过简单的看一下mysql的整个执行流程来看看(如下图所示)
这里简单说一下mysql的执行流程:
1.有sql语句请求查询的时候,首先到查询缓存cache中查找,如果有立刻返回,这是速度最快查询,因为查询缓存在内存中,不了解的可以看下图
2.如果缓存没有,进入查询解析器,生成解析树(了解即可)
3.查询优化器(mysql对一些sql语句进行优化)
4.生成执行计划(explain)
5.进入存储引擎,索引是存储引擎决定的,如果索引能返回数据就不需要去表里面查询了。
6.没有找到,进入表中全表扫描
<这里对mysql不作过多概述>
结论:通过mysql的执行流程可以看出,如果在内存中存在数据返回,是效率最高、速度最快的。因为mysql的核心是注重于数据的持久安全,因此能够基于内存的数据库(nosql)应运而生,我们学习其中最流行的redis。
这里由于我没有Linux服务器所以只是使用虚拟机环境下安装的,有条件建议还是自己买服务器比较好。
环境:VirtualBox+centos7
linux安装常用命令:给出常用linux命令各取所需
(https://blog.csdn.net/qq_36485859/article/details/93968478)
这里没有给出具体的安装虚拟机和linux的步骤,可以自行百度。
下面展示一些 安装命令方式有多种这里只说一种。
准备
cd /usr/local #进入任意目录
yum install wget –y #安装下载工具
wget http://download.redis.io/redis-stable.tar.gz
tar xzvf redis-4.0.8.tar.gz #解压文件
开始安装
cd redis-stable
make
cd src
make install PREFIX=/usr/local/redis
移动配置文件到安装目录下
cd ../
mkdir /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc
配置redis为后台启动
vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes
在根目录启动redis
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
安装关闭防火墙:
yum install firewalld
systemctl stop firewalld.service
第一种启动方式
就是进入redis解压的src目录下的./redis-server,这个需要一直保持启动,当其他操作的时候,ctrl+c退出,redis也退出了。不太方便
第二种后台启动
Ctrl+c退出刚才的启动程序
返回上级目录:cd …/
vim redis.conf
cd src
通过配置文件启动redis: ./redis-server …/redis.conf
查看进程已经启动
cd src
通过配置文件启动redis: ./redis-server …/redis.conf
查看进程已经启动
第三种将redis加入到开机启动
vim /etc/rc.local //在里面添加内容:/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf (意思就是开机调用这段开启redis的命令)
在src目录下执行:
-h是ip地址 -p是端口号,这儿是默认本机加6379可以省略
./redis-cli
redis-server /usr/local/redis/etc/redis.conf //启动redis
pkill redis //停止redis
#卸载redis:
rm -rf /usr/local/redis //删除安装目录
rm -rf /usr/bin/redis-* //删除所有redis相关命令脚本
m -rf /root/download/redis-4.0.4 //删除redis解压文件夹
String类型,类似于java的Map
Key—value都是字符串类型。
常用命令:
设置值:set key value
获取值:get key
删除key:del key
批量插入:mset key1 value1 key2 value2
批量获取:mget key1 key2
Value自增:incr key (相当于i++)
自减:decr key
指定增加多少:incrby key 10 (增加10)
指定减少多少:decrby key 10
获取原来的值并设置新值:getset key newValue
获取value的长度:strlen key
如果key值存在则在key对应的value后面追加字符,不存在则创建:append key value
获得部分value值: getrange key start end (左右包含,算下标)
setnx key value:如果key存在就不设置值,返回0,如果不存在key就设置值
expire key:为key设置过期时间
ttl:查看key过期时间
在这里插入图片描述
注意:这儿创建一个key 然后给key设置过期时间,是两步,不是原子操作。
setex key seconds value:原子操作创建key并设置过期时间
附图一张(下面xmind总结来源于网络,个人只是借鉴学习):
ximind百度云地址:
链接:https://pan.baidu.com/s/1C30PTuW7_ITQfQLBEUkQrw
提取码:px86
Redis hash 是一个string类型的field和value的映射表,类似于java中的map或者bean对象。为了更好的理解该数据结构,先使用基本命令在redis中插入一条数据
打开虚拟机,启动redis,进入客户端,插入一条数据
Hset为hash的设置命令,该数据类似于java中的map:
或者是Student对象,有name与age属性
常用命令:
hset key field value: 可以设置多个
hget key field:获得值,首先指定key,然后指定获得该key的那个属性
hmget key field1 field2…… :获得多个属性的值
hgetall key:获得key的所有属性与值
hlen key:获得key中属性的个数
hdel key field:删除key中某个属性,可以删除多个
hmset key filed value [field value…]:设置多个属性,与hset类似
两者返回值不同:
Hset: 如果field是哈希表中的一个新建域,并且值设置成功,返回1。如果哈希表中域field已经存在且旧值已被新值覆盖,返回0。
Hmset:命令执行成功,返回OK。当key不是哈希表(hash)类型时,返回一个错误
hsetnx key field value --原key的field不存在则set成功,返回1,否则失败,返回0
hkeys key:获得所有的key
hvals key:获得所有的value
hexists key field:判断key中是否存在某个field
hincrby key field step:为key中的field值基础上增加step
hincrbyfloat key field step:类似上面 小数
hstrlen key field:
没有API为hash中某个属性设置过期时间,那么我们可以在java层面,在某个属性的value上做文章,将value的值设置为一个map,用一个key-value表示值,一个key-value表示过期时间
在redis中,list数据结构是按照插入顺序的字符串链表,和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库删除,list中可以包含最大元素数是4294967295.
在reids中list数据结构就是java的链表结构,应该很好理解。
常用命令:
lpush key value [value…]:l是left的缩写 表示从链表左边(链表头)放入数据
lrange key start end:查看start—end中的数据,左包右包 end -1表示到最后
rpush key value [value…]:右边插入数据 r是right的缩写
lpop key:弹出左边第一个元素
rpop key:弹出右边第一个元素
llen key:查看链表的总长度
blpop key [key…] timeout–左侧阻塞式弹出
BLPOP 是阻塞式列表的弹出原语。 它是命令 LPOP 的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候, 连接将被 BLPOP 命令阻塞。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。
Timeout 是超时时间
掌握下图的几种情况就可以了
brpop key [key…] timeout --右侧阻塞式弹出 类似上面
lpushx: 和lpush类似,但是lpushx会校验key是否存在,若key不存在则不进行任何操作
rpushx与上面类似
rpoplpush list1 list2:弹出list1的右边的元素 放入list2左边(医院体检业务,排队做了一项,继续排队做第二项)
brpoplpush :阻塞版本
lindex key index:获取key中index位置的值,负数就反过来数,-1为最后一个
lrem key count value:
count>0从左边删除count个value
count<0从右边删除count个value
count=0删除所有的value
应用场景
排队业务、商城商品浏览记录、评论里面的最新评论、qq空间的我的访客、消息队列等
Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
常用命令
sadd key element [element…]:set集合中添加元素
smembers key:查看集合所有的元素
sismember key element --查看元素是否属于该集合
srem key element [element…] –删除集合元素
scard key --查看集合元素数量
srandmember key --随机获取集合中某一个元素
spop key –弹出一个元素
sinter key1 key2 …… — 多个集合的交集
sdiff key1 key2…… — 返回第一个集合有 后面集合都没有的元素(差集)
sunion key1 key2 key3…. ----所有集合的并集
sinterstore set set1 set2 —找到set1与set2的交集 存放在set中
应用场景
QQ共同好友推荐(交集)、抽奖系统、网站登录人数(去掉重复登录的)、匹配度计算等等
zset在set集合的基础上给每一个元素一个分数描述,从而使元素变得有序可循,默认按分数升序排序。
zadd key score member1 score member2… — 添加元素 每个元素都会携带一个分数
zrange key start end [withscores] —根据下标查看元素 默认分数升序排序
zrevrange key start end [withscores] —类似上面,反取
zrangebyscore key score1 socre2 ----取score1到score2分数 之间的元素
zrevrangebyscore key max min [withscores] ----反取
zrem key member ----删除元素
zcard key ----个数
zscore key member —查看某个元素的分数
zrank key member ----查看某个元素在集合中的排名,默认按分数升序(排名从0开始的)
zrevrank key member ---- 反排名
zincrby key increment member --为某个元素加分
zcount key min max —统计min到max分数间的个数
zremrangebyscore key min max —根据分数段删除
zremrangebyrank key start end — 根据排名删除
了解:
zinterstore destination numkeys key [key…] --这里numkeys表示需要做交集的key的个数
zunionstore destination numkeys key [key…] --这里numkeys代表需要做并集的key的个数
应用场景
王者里面的经济排行、微博热搜的点击率、主播刷礼物排行、商城商品热度等等