08年的时候有一个意大利西西里岛的小伙子,笔名antirez(http://invece.org/),创建了一个访客信息网站 LLOOGG.COM。这个网站是干嘛的呢, 其实就是跟我们的百度统计一样!需要知道网站的访问情况,比如访客的IP、操作系统、浏览器、使用的搜索关键词、所在地区、访问的网页地址等等。我们不用自己写代码去实现这个功能,只需要在全局的 footer 里面嵌入一段JS 代码就行了,当页面被访问的时候,就会自动把访客的信息发送到这些网站统计的服务器,然后我们登录后台就可以查看数据了。 LLOOGG.COM 提供的就是这种功能,它可以查看最多10000条的最新浏览记录。 这样的话,它需要为每一个网站创建一个列表(List),不同网站的访问记录进入到不同的列表。如果列表的长度超过了用户指定的长度,它需要把最早的记录删除(先进先出)。
大家来想一下这样的底层数据怎么来保存了!肯定是用数据库对吧
他最开始的时候用的就是mysql。但是当 LLOOGG.COM 的用户越来越多的时候,它需要维护的列表数量也越来越多,这种记录最新的请求和删除最早的请求的操作也越来越多。 然后mysql数据还是写在磁盘的,那么每一次记录和删除都要读写磁盘,因为数据量和并发量太大,在这种情况下无论怎么去优化数据库都不管用了。 他考虑到最终限制数据库性能的瓶颈在于磁盘,所以打算放弃磁盘,自己去实现一个具有列表结构的数据库的原型,把数据放在内存而不是磁盘,这样就可以大大地提升列表的操作和查的效率。antirez发现这种思路确实能解决这个问题。 所以他用C语言重写了一个内存数据库!(这才是大佬,工具不好用就自己写一个工具) 09年,Redis这个内存数据库出世了。从最开始只支持列表的数据类型,到现在支持多种数据类型,并且提供了一系列的高级特性,Redis已经成为一个在全世界被广泛使用的开源项目。这就是redis的由来!
那么redis的全称是全称是REmote DIctionary Service,直接翻译过来是远程字典服务
官网介绍(可以直接点)
中文官网(可以直接点)
Redis是C语言编写的,编译需要GCC。 Redis6.x.x版本支持了多线程,需要gcc的版本大于4.9,但是CentOS7的默认版本是4.8.5。
查看gcc的版本:
gcc -v升级gcc版本:
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc
devtoolset-9-gcc-c++
devtoolset-9-binutils
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profiledaemonize yes //更改为后台启动
#bind 127.0.0.1 //注释
protected-mode no //允许外部网络直接访问如果src没有redis-server,在redis目录执行make
[root@localhost src]# ./redis-server ../redis.conf //启动服务
[root@localhost src]# ./redis-cli //进入客户端现在正常都是三主三从6个节点了 我把6节点分别放在127.128.129 3台机器的 6380、6381端口
cp -r redis-6.0.16 redis-6.0.16-6381
mv redis-6.0.16 redis-6.0.16-6380#bind 127.0.0.1
protected-mode no
daemonize yes
cluster-enabled yes //可开启集群
cluster-config-file nodes-6380.conf
pidfile /var/run/redis_6380.pid[root@localhost src]# ./redis-cli --cluster create
192.168.8.129:6380 192.168.8.129:6381 192.168.8.128:6381
192.168.8.128:6380 192.168.8.127:6380 192.168.8.127:6381 -
cluster-replicas 1(需进入客户端)
就一个字:快 这个工具发明出来的意义就是为了快
为什么快?
它默认有16个库(0-15),这个其实可以在配置文件中修改的,默认使用第一个db0。
//切换数据库
select 0我们刚才讲过它是一个key-value的方式,所以:
//存值:
set zwq 666
//取值:
get zwq 我是不是能像数据库的一样每个业务用不同的db? 能,但是我不建议!为什么呢,因为我们有个命令能很轻松的删库跑路!
//清空所有数据库
flushall//清空当前数据库
flushdb//查看所有键
keys *//获取键总数
dbsize//重命名键
rename zwq 777//对某个key设置过期时间
expire zwq 10
pexpire zwq 10000//查看键是否存在
exists zwq//删除键
del zwq//查看对外类型
type zwq这些是一些比较基本的命令,还有一些命令我就不一一列举了,大家可以自己去看下, 常用命令
Redis有这么多数据类型:String、Hash、Set、List、Zset、Hyperloglog(基数统计)、Geo(地理 位置)、Streams流。 但是常用的其实就5个。
我们刚才已经知道了redis里面都是key-value的结构存储的,那么string数据类型那个value可以存储什么?其实这个value可以存储String,Number,Float,Bits等等… 那么这个String到底是怎么玩的,我们来看下string的一些基本指令!
set get 就不说了
//批量设置
mset zwq 111 zwq2 222
//批量获取
mget zwq zwq2
//字符串追加内容
append zwq 123
//获取指定范围的字符
getrange zwq 0 5
//(整数)值递增
incr intkey
incrby intkey 100
//(浮点数)值递增看
set f 2.6
incrbyfloat f 7.3
//如果不存在这个key设置成功,存在设置失败(分布式锁)
//EX − 设置指定的到期时间(以秒为单位)。
//PX - 设置指定的到期时间(以毫秒为单
//NX - 仅在键不存在时设置键。
//XX - 只有在键已存在时才设置。
set lock1 1 EX 10 NX
setnx k1 1应用场景:
我们发现我们string可以存浮点,整型,字符串类型,但是假如我要存一个对象怎么办,转换成json,读时再转换回来? 这样可以实现,但是有更加直接的方法: Hash 的结构是这样的 : Key file value 比String多了一个小file,我们把它当作字段名就好。 那么面试题来了,为什么要有这个hash数据类型? 1、把所有相关的值聚集到一个大key中,节省内存空间 2、只使用一个key,减少key冲突 3、当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU 的消耗 但是,它也有一个不足: 1、不能设置file的过期时间,我们只能针对于key设置过期时间 使用场景: String可以做的事情,Hash都可以做!
操作命令可以参考这个网站:
常用命令
存储有序的字符串(从左到右),元素可以重复。可以充当队列和栈的角色。 应用场景:
但是队列我不建议大家用redis了,为什么,因为我们有更加成熟的技术,就是我们的MQ! 并且redis它是内存型数据库,可能会造成数据丢失,还有它消费了后没法回应!
操作命令可以参考这个网站:
常用命令
String类型的无序集合,最大存储数量 2^32-1(40 亿左右)。
应用场景
操作命令可以参考这个网站:
常用命令
应用场景
操作命令可以参考这个网站:
常用命令
redis常用的5种数据类型以及使用场景! (1)String 缓存,计算器,分布式锁等等 (2)Hash 有子键filed 购物车等场景 (3)List 有序集合,元素可以重复队列,有序列表 (4)Set 无序集合,元素不可重复关注点赞,抽奖 (5)ZSet 有序集合,元素不可重复排行榜
它的特性: (1)分布在内存以及IO多路复用,速度快 (2)很丰富的数据类型支持 (3)能分布式集群部署,保证高可用 (4)支持持久化,数据过期以及淘汰