目录
- 一、为什么要学Redis?
- 二、Redis安装
- 三、Redis基础
- 3.1 Redis是单线程的
- 3.2 常见五大数据类型及相关命令
- 3.2.1 RedisKey的基本命令
- 3.2.2 五大常用类型
一、为什么要学Redis?
我们学一个新东西,最先要了解为什么学?也就是Redis能解决什么问题。我们可以画图一步步解释
首先,客户端会有大量用户请求发送给服务器,单个服务器接受不了如此大的请求的话就需要配置服务器集群,比如双十一就会新增大量服务器。
增加服务器可以解决客户端请求量过大问题,但是也会存在问题的是,也就是数据库的压力太大,并且如果对于用户常用的一些数据,每次都到数据库查,也非常耗时,所以对于经常操作的热点数据就放在Redis中。Redis是基于内存进行存储数据和读取数据的,支持高并发,性能非常好,效率比在MySQL中读取数据快很多。并且服务器存在一些问题,就是以前用Session存数据的话,因为服务器是集群,存的第一个Session放在服务器1,但是下次拿由于请求随机的,可能就拿不到之前存的Session,而是到另一个服务器上找。用了Redis,统一放在Redis中就能解决这个问题,包括锁的操作,集群就实现不了互斥,如果是一个服务器还能,多个就不能了。Redis它接收用户请求是单线程的,实现这种锁的效果。以上就是为什么要用Redis,也就是它能解决的问题。
总结Redis能解决的问题:
1、用户量过大,请求也大,数据库压力大
2、多台服务器之间数据不同步,也就是Session存数据存在的问题。
3、多台服务器之间的锁,不存在互斥性
Redis有这么多好处,能解决这么多问题,那我们来学一学吧!!!
二、Redis安装
简单介绍Redis
Redis(Remote Dictionary Server—远程服务字典)是一款非关系型数据库(NoSQL->Not Only SQL),是基于Key-Value的NoSQL,用C语言编写,并且具备持久化,不会因为数据库异常、崩溃或断电丢失数据,非关系型数据库其实还有ElasticSearch、Mongodb,我们现在来安装一下。
详细了解Redis链接:http://www.redis.cn/
Redis推荐在linux搭建安装,Windows已经停更很久了,也慢,基本都是在linux上操作。首页即可下载安装包,是在linux安装的redis包
我下载的时候真的慢,一共才2,1M,半天动不了,可能是连外网。这里给一个博主分享的百度网盘,下载redis 6.0.8版本的链接
下载好直接拖拽到MobaXterm中即可,下面的博客安装十分细致,非常nice,跟着安装即可
不过注意里面redis.conf,有一两个它写成了redis.config,这个要注意,不要复制它的redis.config,要写redis.conf,我在该博主评论区说了下,不知道看不看得到。
测试性能(补充了解)
假设我们要测试,100个并发连接 100000请求,看下性能,redis-benchmark就是用于测试性能的
首先没有启动redis要先启动一下连接
redis-server rconfig/redis.conf
redis-cli -p 6379
测试命令如下
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
这个是压力化测试,我们了解即可,跟着弄一遍就行
三、Redis基础
3.1 Redis是单线程的
Redis快是多线程吗?不,Redis是单线程的!!!
为什么Redis采用单线程还那么快???
(1) Redis绝大部分请求是纯粹的内存操作,非常的快,它不是基于CPU的
(2) 采用单线程,避免了不必要的上下文切换和竞争条件,因为多线程CPU需要上下文切换,有代价与开销
补充:
Redis有16个数据库,默认是0这个数据库
初始没有设置数据,set key value后,就有值了,如果我们切换到其他数据库,如2,它就是空的,也就是每个数据库都独立的,keys *
可以查看数据库中所有的key,get key可以获取value值(上面图我备注错了,[3]应该表示第4个数据库)
flushdb #清除当前数据库数据
flushall #清除全部数据库(慎用)
3.2 常见五大数据类型及相关命令
3.2.1 RedisKey的基本命令
先说一些命令,再将5大类型
之前讲过常见的set key value,get name,keys *
,还有一些命令如下
EXISTS KEY #有对应值会返回1,否则返回0
move key 1 #将key从当前数据库移动到指定数据库
del key #删除key
EXPIRE key 时间 #设置key什么时候过期,如EXPIRE name 10表示name10秒后过期,14天免登录可以用
ttl key #key还剩多久过期,-2表示已过期
type key #查看key的类型
以后想要相关命令也可以到官网搜索
3.2.2 五大常用类型
如果之前有数据库,用flushdb
全部删除,重新创建
(1)String
append key 追加内容 #给key追加内容,key不存在就相当于set创建,存在则追加
strlen key #查看key对应value的长度
incr key #+1
dece key #-1
incrby key 增量 #如incrby num 10就是每次执行+10
decrby key 减量
getrange key index1 index2 #截取key
setrange key index 替换的内容 #从index位置替换,即替换指定位置开始的字符串
setex key 时间 value #设置时间期限创建key
setnx key value #key不存在才能创建,存在就创建失败
mset key1 value1 key2 value2 ... #同时设置多个值
mget key1 key2 #同时取多个值
msetnx key1 value1 key2 value2 #不存在时创建,这是原子性操作,要么同时创建成功,要么失败,有一个失败都
常常用redis自增做阅读量,比如阅读量就可以用这个,查看一下,就自增1
getset命令
getset key value #如果key没有设置,那么get返回为空,然后再set值,已经有值会先返回get的值,然后set新的value
(2)List
列表就像下面图,flushdb
清除之前数据库
我们先用flushdb
将数据库清空,再来玩List
lpush key value #向列表中push值,有点像栈
lrange key 0,-1 #表示获取所有值,0 1就是l取两个值
这里key一般写list表示列表
lpush就是左边push,rpush就是从右边push
就是可以从两边插入值,可以插入那么也就可以删除
lpop key #返回出列表的元素
rpop key
lindex key 下标 #从左边查找元素,从0开始
llen key #返回列表长度
lrem key 移除数量 value #移除固定的值
ltrim key 下标1,下标2 #截取
lset key 下标 替换的值 #替换某一个元素
trim就是修剪,会把以前的列表修改,就像剪树枝,会剪去一部分,留下一部分
下面对应更新操作
组合命令
rpoplpush 列表1 列表2 #列表1右端第一个移动到列表2的左边
linsert key before/after 元素1 元素2 #将元素2插入到元素1的前面或者后面
两边插入或者改动效率最高,中间来说效率会低不少,栈(Lpush Lpop),队列(Lpush,Rpop)
(3)Set
Set中的值不能重复,和java中一样,先flushdb
清除之前数据库
sadd key members #添加元素
smembers key #查看所有值
sismember key 元素 #查看某个元素是否在集合中
scard key #查看集合有多少元素
srandmember key count #随机获取key中count个值,不写count默认1个
spop key #随机移除元素
添加重复的会不成功,返回false
smove key1 key2 元素 #将一个指定的值移动到另一个Set集合中
sinter key1 key2 #求key1和key2的交集
sunion key1 key2 #求两个的并集
这个交集就像微信中,会显示多少好友关注过某个公众号,就把好友的公众号和自己做了一个交集,微博里共同关注的博主也是
(4)Hash
Map集合,key-map,就是key对应一个map,map又有自己的键值对,key-value,这里value变成了map而已
hset key field value #key-map,map即field和value
hget key field #取值
hmset key field1 value1 field2 value2... #存多个值
hmget field1 field2 #取多个值
hdel key field #删除指定的key对应的map
hgetall key #获取所有key中所有的field-value
hlen key #判断key的长度(多少个map)
hkeys key #获取key对应map中的所有字段
hvals key #获取key对应map中的所有值
hincrby key field 自增值
我们实际可以设置自己的user对象,user:1表示id为1的user,常用于用户信息的存储或者说对象的存储
(5)ZSet
ZSet是有序集合,多了一个score计数位,用于排序,flushdb
清除之前数据库
zadd key score1 value1 score2 value2 #增加了一个score,会根据score大小排序
zset最大作用就是排序,那我们就来排序看看,给员工薪水排序
zrangebyscore salary (2000 3000 #薪水在(2000,3000]的员工
zrangebyscore salary -inf +inf withscores limit 0 1 #最小,limit表示从下标为0的位置查一个
zrevrangebyscore salary +inf -inf withscores limit 0 1 #最大
下面就是从下标为1和下标为2位置找一个
本章节完毕