共计 3963 个字符,预计需要花费 10 分钟才能阅读完成。
一、前言
大家好,我是深度 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 -y
yum 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 bj
mget country city
自增 / 减操作
# 第一次没有值会为
1incr age
#取得的值为
1get age
# 减操作,始终减的话是能够变为正数的
# decr age
# 依照指定的区间,每次加 10
incrby 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 个元素。上面演示下列表命令。
# 从右向左插入 返回 3
rpush 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 的名次,反向排序。他排在最下面,反向则返回 2
zrevrank 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 命令参考