一、前言
大家好,我是深度Linux,本系列专栏是对 Redis 的入门以及进阶应用,心愿对大家有所帮忙。
二、根底
(1)介绍
首先来看下redis 官网,如果感觉看着吃力,也有国人翻译的中文版本redis 中文网站。上面来看一下网站对Redis的介绍。
Redis 是一个开源(BSD 许可)的,内存中的数据结构存储系统,它能够用作数据库、缓存和消息中间件。 它反对多种类型的数据结构,如字符串(strings), 散列(hashes), 列表(lists), 汇合(sets), 有序汇合(sorted sets)范畴查问, bitmaps, hyperloglogs 和 天文空间(geospatial) 索引半径查问。 Redis 内置了复制(replication),LUA 脚本(Lua scripting), LRU 驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘长久化(persistence), 并通过 Redis哨兵(Sentinel)和主动 分区(Cluster)提供高可用性(high availability)。如果看了还感觉莫名其妙,没关系。简略来说Redis是一种基于键值(Key-Value)的高性能内存数据库。它提供了一些有用且不便的数据结构,比方Value能够string、hash、list、set、zset,因为这种构造的存在,咱们平时的开发中就能够灵便的利用这些构造优化咱们的技术实现。同时Redis还提供了键过期,公布订阅,事务,流水线等其它附加性能。如果看到这里你还没明确,没关系,接下来我将一点一点揭开它神秘的面纱。让你真正做到从入门到夺门而出。
(2)个性
如果有人问你,你用过Redis,那它有什么个性呢,上面的答案请务必记住(当然了,忘性不好的譬如我记住几条要害的也可)。来看一下答案:
- 速度快,读写性能10W/s,当然了和机器配置也有关系为什么快呢?内存操作,C语言实现,离操作系统API更近;单线程架构(务必不要记错),防止了多线程竞争带来的损耗。IO多路复用,协定简略。
- 反对长久化,尽管是交互时是内存操作,但提供数据落盘机制,避免断电产生的数据失落问题。
- 反对主从复制:多正本 Master-Slave 节点
- 反对高可用 HA:哨兵(sentinel)机制实现高可用,保障节点故障主动发现和故障转移
- 反对多客户端语言:Java、Python、C++等。
(3)应用场景
那什么时候能够思考应用呢?什么时候能够用而不是故意炫技呢?来看一下目前常见的应用状况:
- 缓存:数据库之前加缓存,升高数据库读写压力
- 排行榜:依照热度排名、依照公布工夫排名
- 计数器:播放数、浏览数
- 社交网络:赞、踩、粉丝、下拉刷新
- 音讯队列:公布订阅
(4)装置
Redis反对Windows和Linux,如果只是本人玩玩,能够间接应用Windows版本,十分的简略和疾速就能启动。这里就不给出Windows环境下的安装包了,网上一搜到处都是。上面次要阐明下Linux环境下的装置与根本配置(当然了,只是以启动服务客户端能够连贯为目标的简略配置)
以centos7举例:
1、依赖查看
yum install cpp -yyum install binutils -y yum install glibc-kernheaders -y yum install glibc-common -y yum install glibc-devel -y yum install gcc -y yum install make -y
2、下载编译安装包
cd /usr/local mkdir soft cd soft wget http://download.redis.io/releases/redis-4.0.6.tar.gz tar xzf redis-4.0.6.tar.gz cd redis-4.0.6 make mkdir /usr/local/redis cp redis-server /usr/local/redis cp redis-benchmark /usr/local/redis cp redis-check-rdb /usr/local/redis cp redis-sentinel /usr/local/redis cp redis-cli /usr/local/redis cp redis.conf /usr/local/redis
个别须要设置明码,留神批改redis.conf文件 批改 requirepass 123456789 ,并且批改bind 127.0.0.1为本机的外网 IP,否则无奈通过近程机器连贯。
启动: ./redis-server redis.conf &
应用客户端连贯: ./redis-cli -h 192.168.9.100 -p 6379 -a 123456789
三、数据结构
这里也来介绍下 Redis 常见的数据结构,不便大家应用。
删库跑路操作flushall,清空所有值。
(1)罕用操作
# 设置 key 为 name,value 为 pleuvoir 的字符串,并且10秒后过期set name pleuvoir ex 10# 查看 key = name 的过期工夫ttl name# 查看 key = name 的值get name# set nx 如果没有则设置,否则不操作(分布式锁罕用)setnx name pleuvoir
批量设值,缩小 IO,原子性
mset country china city bjmget country city
自增/减操作
# 第一次没有值会为1incr age#取得的值为1get age# 减操作,始终减的话是能够变为正数的# decr age# 依照指定的区间,每次加10incrby age 10# 依照浮点型,incr 只能针对整型incrfloat score 1.1
哈希操作
#设置hmset user:1 name pleuvoir age 18#获取hgetall user:1
学习材料视频收费支付,收费学习看这里
四、列表(List)
简略来说就是一个 key 对应的值是多个有序的字符串。对应到Java中如下:
List<String> users = new ArrayList();users.add("pleuvoir");users.add("realtrump");users.add("jack");
当然,它的操作还是比拟多的,为了不便了解,我画了个图。
因为有序,所以依照下标获取天然是反对的。请留神:一个列表最多能够贮存2^32-1个元素。上面演示下列表命令。
# 从右向左插入 返回3rpush users pleuvoir realtrump jack# 查找所有元素lrange users 0 -1# 返回以后列表长度llen users# 弹出最右边元素lpop users
五、汇合(Set)
保留多元素,不容许有反复值,并且无序。只能保留2^32-1个元素。除此之外,能够求交加、并集、差集。能够利用此个性实现一些利用上的需要。应用形式如下:
# 插入sadd language chinese english# 若再次插入则疏忽反复sadd language chinese english# 查看全副(后果无序)smembers language# 删除某个元素srem language chinese# 查看以后元素个数scard language
另外,因为能够计算交加的个性,在理论的利用中比方能够失去两个人雷同的喜好。
# 小明喜爱的色彩sadd color:xiaoming red blue green# 小红喜爱的色彩sadd color:xiaohong red blue# 计算他们独特喜爱的色彩sinter color:xiaoming color:xiaohong
六、有序汇合(Zset)
罕用做排行榜。具体和汇合的区别是,每个元素多了一个打分。这样能够依照评分来进行排序。
以下组数据进行举例,看看是如何通过命令实现操作的,咱们暂且认为这是点赞排行榜,key 为good_ranks
# 初始化点赞数据zadd good_ranks 20 xiaoming 300 xiaohong 1 xiaowang# 查看分数与成员zrange good_ranks 0 -1 withscores能够看出,默认分数是从小达到排序的。# 返回xiaoming的名次,正向排序。返回1 下标从0开始,是第二名zrank good_ranks xiaoming# 返回xiaowang的名次,反向排序。他排在最下面,反向则返回2zrevrank good_ranks xiaowang
这里只是简略的列举了几种场景,上面举个理论的例子在利用中如何保留对象信息。
七、场景举例
假如咱们的需要是保留用户信息,那么该选取何种数据结构,并且它们有什么优缺点?
当初有一个对象:
User user = new user();user.setName("pleuvoir");user.setAge(18);应用哈希构造hmset user:1 name pleuvoir age 18
长处:简略间接,每个 key 对应一个 value。毛病:哈希构造占用内存大,并且最大保留512M。
2.应用序列化
这里有两种状况,一种是应用字符串模式,另外一种是应用序列化工具如ProtoBuf以二进制的模式存储。
字符串模式:
set user {"name":"pleuvoir","age":18}
二进制模式就不做展现了,若应用正当能够节约内存,然而如果应用一些图形化工具查看,可能看的不是很分明。
这两种序列化的形式独特的毛病是:批改一个属性,批改反序列化整个对象,设置完值当前再序列化保留到Redis这个老本还是比拟大的。长处是:编程简略。
九、全局命令
# 查看所有Key,线上审慎操作keys * # 查看是否存在exists [key]# 设置过期工夫expire [key] [seconds]# 查看过期工夫ttl [key]# 查看键的数据类型type [key]
十、参考链接
Redis 命令参考