你们好,我是深度Linux,本系列专栏是对 Redis 的入门以及进阶使用,但愿对你们有所帮助。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,那它有什么特性呢,下面的答案请务必记住(固然了,记性很差的譬如我记住几条关键的也可)。来看一下答案:centos
(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多线程
这里也来介绍下 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
简单来讲就是一个 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
保存多元素,不容许有重复值,而且无序。只能保存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
经常使用作排行榜。具体和集合的区别是,每一个元素多了一个打分。这样能够按照评分来进行排序。
如下组数据进行举例,看看是如何经过命令完成操做的,咱们暂且认为这是点赞排行榜,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这个成本仍是比较大的。优势是:编程简单。
# 查看全部Key,线上谨慎操做 keys * # 检查是否存在 exists [key] # 设置过时时间 expire [key] [seconds] # 查看过时时间 ttl [key] # 查看键的数据类型 type [key]