Redis 从入门到精通(基础)

一、前言

大家好,我是深度Linux,本系列专栏是对 Redis 的入门以及进阶使用,希望对大家有所帮助。
Redis 从入门到精通(基础)_第1张图片

二、基础

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

  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举例:
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 从入门到精通(基础)_第2张图片

三、数据结构

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

Redis 从入门到精通(基础)_第3张图片

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

四、列表(List)

简单来说就是一个 key 对应的值是多个有序的字符串。对应到Java中如下:

List users = new ArrayList();
users.add("pleuvoir");
users.add("realtrump");
users.add("jack"); 

当然,它的操作还是比较多的,为了方便理解,我画了个图。
Redis 从入门到精通(基础)_第4张图片

因为有序,所以按照下标获取自然是支持的。请注意:一个列表最多可以储存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
Redis 从入门到精通(基础)_第5张图片

# 初始化点赞数据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 命令参考

你可能感兴趣的