Redis 从入门到精通(基础)

1、前言

你们好,我是深度Linux,本系列专栏是对 Redis 的入门以及进阶使用,但愿对你们有所帮助。
在这里插入图片描述redis

2、基础

(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,那它有什么特性呢,下面的答案请务必记住(固然了,记性很差的譬如我记住几条关键的也可)。来看一下答案:centos

  1. 速度快,读写性能10W/s,固然了和机器配置也有关系为何快呢?内存操做,C语言实现,离操做系统API更近;单线程架构(务必不要记错),避免了多线程竞争带来的损耗。IO多路复用,协议简单。
  2. 支持持久化,虽然是交互时是内存操做,但提供数据落盘机制,防止断电产生的数据丢失问题。
  3. 支持主从复制:多副本 Master-Slave 节点
  4. 支持高可用 HA:哨兵(sentinel)机制实现高可用,保证节点故障自动发现和故障转移
  5. 支持多客户端语言:Java、Python、C++等。

(3)使用场景
那何时能够考虑使用呢?何时能够用而不是故意炫技呢?来看一下目前常见的使用状况:缓存

  • 缓存:数据库以前加缓存,下降数据库读写压力
  • 排行榜:按照热度排名、按照发布时间排名
  • 计数器:播放数、浏览数
  • 社交网络:赞、踩、粉丝、下拉刷新
  • 消息队列:发布订阅

(4)安装
Redis支持Windows和Linux,若是只是本身玩玩,能够直接使用Windows版本,很是的简单和快速就能启动。这里就不给出Windows环境下的安装包了,网上一搜处处都是。下面主要说明下Linux环境下的安装与基本配置(固然了,只是以启动服务客户端能够链接为目的的简单配置)
以centos7举例:
一、依赖检查网络

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

二、下载编译安装包数据结构

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
在这里插入图片描述
在这里插入图片描述多线程

3、数据结构

这里也来介绍下 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

在这里插入图片描述

学习资料视频免费领取,免费学习看这里

4、列表(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

5、集合(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

6、有序集合(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

这里只是简单的列举了几种场景,下面举个实际的例子在应用中如何保存对象信息。

7、场景举例
假设咱们的需求是保存用户信息,那么该选取何种数据结构,而且它们有什么优缺点?

如今有一个对象:

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这个成本仍是比较大的。优势是:编程简单。

9、全局命令

# 查看全部Key,线上谨慎操做
keys * 
# 检查是否存在
exists [key]
# 设置过时时间
expire [key] [seconds]
# 查看过时时间
ttl [key]
# 查看键的数据类型
type [key]

10、参考连接

Redis 命令参考

相关文章
相关标签/搜索