年底的时候开始尝试在重构的项目中使用redis,现在项目稳定运行也有一段时间了,这里做一下阶段性总结。

一、简介

首先,redis是什么意思呢,官方文档的FAQ里给出了答案:It means REmote DIctionary Server.也就是说,它是一个可提供远程调用的字典服务器,从名字就可以看出,它起码得是一个k-v服务器吧:),事实上,它除了支持get、set、del等基本操作之外,还支持许多更复杂一些的操作,这也是它优于memcached等其他k-v组件的地方。

Redis是一个高级的k-v服务器,既可以做cache使用,也可以做存储使用,同时,它也可以被称作是一个数据结构服务器。为什么说它可以叫数据结构服务器呢?因为它支持几种数据结构,作为key-value里的value这一项,它可以存储strings, hashes, lists, sets, sorted sets, bitmaps以及hyperloglogs等数据结构,同时,针对不同的数据结构,Redis专门提供了一些特别的操作,使得我们可以使用get set之外的一些操作,例如你可以对两个set取交集并返回结果。

二、安装和启动

Redis的安装非常简单,从官网下载最新的稳定版客户端,make就可以了:

$ wget http://download.redis.io/releases/redis-2.8.19.tar.gz

$ tar xzf redis-2.8..tar.gz

$ cd redis-2.8.

$ make

启动也非常简单,编译好的二进制文件会生成在src目录下,直接执行,即可使用默认配置启动redis服务:

$ src/redis-server

这样服务就启动起来了,redis默认监听6379端口,我们可以使用客户端(redis-cli)访问并测试它:

$ src/redis-cli

redis> set foo bar

OK

redis> get foo

"bar"

更复杂的配置设置我们在后边再介绍。

三、基本使用举例

想要快速了解redis的使用方法,强烈推荐官网的一篇文章Writing a simple Twitter clone with PHP and Redis(http://redis.io/topics/twitter-clone),如果不熟悉php语法没有关系,php的client基本上就是把redis的命令原封不动的封装了,该文章从实战的角度描述了几种数据结构的使用方法以及在实际使用过程中应该如何设计自己的存储方式。这里我们简单介绍几种数据结构的使用方法:

3.1 string

String是最基本的数据结构了,如果单纯的使用string,那么redis与普通的k-v数据库并无区别,无非就是get、set,下面我们看一下string的基本操作:

> set mykey somevalue

OK

> get mykey

"somevalue"

当执行set的时候,如果”mykey”这个key下原来没有值,则会把”somevalue”存进去,否则下存储的值会被覆盖。

如果只提供get、set,那redis就不是redis了,对于一个key,我们还可以使用INCR,DECR来使数值类型的值增加或减少,还有MGET命令,可以同时获取多个key的值,这在实际使用过程中都会非常有用,例如当你需要同时获取多个数值时,只要一次调用MGET即可,大幅减少网络开销。

3.2 hashes

接下来我们看hash,第一反应,我们可能会想,刚才的string不就是hash吗,从key映射到value。事实上,redis这里说的hash,相当于是对于刚才的string形式的一种嵌套,相当于是我们有一个hash的对象,这个对象的名字叫做key,而它的值又是一个hash,而它的值的key,在redis里叫做field,那么我们就可以了解hash的插入数据的命令了:

> hset user: username

OK

> hget user: username

"antirez"

Hash也可以同时写入多个值,使用HMSET命令即可:

> hmset user: username antirez birthyear  verified 

OK

类似的,同时读取多个值的时候也可以用HMGET命令,但是需要注意的是使用HMGET获取的时候,一次只能读取同一个key下的多个field值,而不能获取不同的key下的不同field值,如果想获取不同key下不同field值,可以使用redis的pipeline方式获取,从而减少开销。

3.3 sorted sets

Sorted set是一种高级的set,redis本身也支持set,但是我们这里直接讲sorted set吧,它相比普通的set,多了一个score项,也即当插入数据的时候,每一个值都可以赋予它一个score,那么score是做什么用的呢?sorted set,顾名思义,就是可以根据score进行排序了,当我们取出来的时候就可以看到,这个列表是排好序的,这个功能非常的有用,例如当我们想要开发一个排行榜的时候,直接插入榜单项和排名分数就可以了,亦或是要开发一个微博系统时,使用它来存储timeline,使用消息发表时间作为score,那么timeline自然就是排好序的了,而且再利用redis本身提供的取交集或并集功能,这使得业务层的开发量极大的减少,下面我们看一下命令示例:

> zadd hackers  "Alan Kay"

(integer) 

> zadd hackers  "Sophie Wilson"

(integer )

> zadd hackers  "Richard Stallman"

(integer) 

> zadd hackers  "Anita Borg"

(integer) 

> zadd hackers  "Yukihiro Matsumoto"

(integer) 

> zadd hackers  "Hedy Lamarr"

(integer) 

> zadd hackers  "Claude Shannon"

(integer) 

> zadd hackers  "Linus Torvalds"

(integer) 

> zadd hackers  "Alan Turing"

(integer) 

读取的时候使用ZRANGE或者ZREVRANGE,顾名思义就是正序或反序读取:

> zrange hackers 0 -1 withscores

1) "Alan Turing"

2) "1912"

3) "Hedy Lamarr"

4) "1914"

5) "Claude Shannon"

6) "1916"

7) "Alan Kay"

8) "1940"

9) "Anita Borg"

10) "1949"

11) "Richard Stallman"

12) "1953"

13) "Sophie Wilson"

14) "1957"

15) "Yukihiro Matsumoto"

16) "1965"

17) "Linus Torvalds"

18) "1969"

其中withscores是告诉redis是否要返回score项,如果不带此参数则只返回人名列表,非常的方便。

3.4 小结

Redis提供非常丰富的命令可供使用,使得我们可以很方便的对存储数据进行一些高级的操作,而不是仅仅把它当作一个k-v的存储数据,这样可以从一定程度上减少我们的业务复杂性。

Redis命令可以在官网查询到(http://redis.io/commands),在此不一一列举。

四、配置与部署

4.1 持久化

Redis提供两种持久化的方式,使得数据可以落到磁盘上,避免服务崩溃或者机器重启后数据丢失,它们分别是AOF和RDB。

AOF相当于我们服务中通常使用的binlog,每当有写请求过来的时候,redis都会把这个请求写入到AOF文件中,当redis崩溃时,可以读取AOF文件从而重建数据。

RDB又叫snapshoting,也就是快照,相当于我们服务中经常用到的把数据从共享内存dump到磁盘上的操作。

这两个选项均可以在配置文件中配置,redis提供了一个配置文件模版,在redis文件夹下的redis.conf文件,当使用配置文件启动redis时,在redis后边加一个配置文件的参数即可:

src/redis-cli redis.conf

想要打开AOF功能,则可以修改配置文件中的appendonly项为yes,并指定appendfilename为aof的文件名,注意这里只是配置文件名,文件路径需要修改dir配置项,这个配置项同样应用于RDB文件。

RDB功能是默认打开的,它受配置文件中的save项影响:

save  

save  

save  

这里解释一下这几个选项的意思:SAVE N M代表每N秒至少有M个变化的时候,才进行rdb操作,那么上边的三个选项意思是,当60秒内有10000个变化时,就写磁盘,而当300秒内有10个变化时,也要写磁盘,如果写入实在不频繁,那么900秒内,如果有一个变化,也要写一次。

除了自动化的方式,我们也可以手动调用BGSAVE命令,强制执行数据备份,但是这个命令从字面上来看貌似是background的,但是实际上,也会造成服务阻塞!

需要注意的是,AOF功能可以开启压缩机制,当AOF文件过大时,可以进行压缩;但是这个操作是会阻塞进程的,所以慎重使用!RDB文件也是同样,当执行写RDB操作时,进程也是阻塞的,这两个地方是redis比较让人头疼的地方,目前并没有发现太完美的解决方案。

4.2 主备同步

主备同步的设置比较简单,在配置文件中配置slavof选项:

slaveof <masterip> <masterport>

redis启动的时候就会跟主机建立连接,然后主机会把数据同步过来,但是要注意的是,这个过程也是阻塞的,服务在这个时间内也不可访问。

4.3 小结

Redis提供了简单的持久化的方式,但是它阻塞的方式往往会造成一定时间内的服务不可用,所以在选型的时候要结合自己的业务情况再做决定应该使用怎样的配置。

Redis使用总结-基础篇的更多相关文章

  1. (六)SpringBoot2.0基础篇- Redis整合(JedisCluster集群连接)

    一.环境 Redis:4.0.9 SpringBoot:2.0.1 Redis安装:Linux(Redhat)安装Redis 二.SpringBoot整合Redis 1.项目基本搭建: 我们基于(五) ...

  2. 生产消费者模式与python+redis实例运用(基础篇)

    根据这个图,我们举个简单的例子:假如你去某个餐厅吃饭,点了很多菜,厨师要一个一个菜的做,一个厨师不可能同时做出所有你点的菜,于是你有两个选择:第一个,厨师把所有菜都上齐了,你才开始吃:还有一个选择,做 ...

  3. 小白也能看懂的Redis教学基础篇——朋友面试被Skiplist跳跃表拦住了

    各位看官大大们,双节快乐 !!! 这是本系列博客的第二篇,主要讲的是Redis基础数据结构中ZSet(有序集合)底层实现之一的Skiplist跳跃表. 不知道那些是Redis基础数据结构的看官们,可以 ...

  4. 小白也能看懂的Redis教学基础篇——做一个时间窗限流就是这么简单

    不知道ZSet(有序集合)的看官们,可以翻阅我的上一篇文章: 小白也能看懂的REDIS教学基础篇--朋友面试被SKIPLIST跳跃表拦住了 书接上回,话说我朋友小A童鞋,终于面世通过加入了一家公司.这 ...

  5. redis数据库基础篇

    一.Redis介绍 Redis 是一个高性能的key-value数据格式的内存缓存,NoSQL数据库.NOSQL:not only sql,泛指非关系型数据库.关系型数据库: (mysql, orac ...

  6. 二、Redis基本操作——String(实战篇)

    小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...

  7. Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简介

    很久之前就打算开始写一下自己的技术博客了,实在抽不出时间所以计划一直搁置了,最近项目进度渐渐缓了下来,不那么忙了,也因此开始筹备自己的博客.说到这次博客的主角,也是无心插柳找到的,来源于两年前自己写的 ...

  8. 【SSM之旅】Spring+SpringMVC+MyBatis+Bootstrap整合基础篇(一)项目简介及技术选型相关介绍

    试水 一直想去搭建个自己的个人博客,苦于自己的技术有限,然后也个人也比较懒散.想动而不能动,想动而懒得动,就这么一直拖到了现在.总觉得应该把这几年来的所学总结一番,这样才能有所成长. 不知在何时,那就 ...

  9. Python 经典面试题汇总之基础篇

    基础篇 1:为什么学习Python 公司建议使用Python,然后自己通过百度和向有学过Python的同学了解了Python.Python这门语言,入门比较简单,它简单易学,生态圈比较强大,涉及的地方 ...

随机推荐

  1. Docker Java程序镜像制作

    Docker Java程序镜像制作 制作前的准备 jre:不需要完整的jdk,jre即可,到Oracle进行下载即可,下载链接,根据自己的情况进行选择,这里选择jre-8u221-linux-x64. ...

  2. 剑指offer难题代码

    重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,前重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.假如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序 ...

  3. 剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers)

    剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers) https://leetcode.com/problems/sum-of-two-in ...

  4. 用Python搞出自己的云词图 | 【带你装起来】

    作者:AI算法与图像处理 参考:http://www.sohu.com/a/149657007_236714 云词图简介 什么词云 由词汇组成类似云的彩色图形.“词云”就是对网络文本中出现频率较高的“ ...

  5. 【Python】机器学习之单变量线性回归 利用正规方程找到合适的参数值

    [Python]机器学习之单变量线性回归 利用正规方程找到合适的参数值 本次作业来自吴恩达机器学习. 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方),数据中包括不同 ...

  6. 如何下载spring sts

    1.打开https://spring.io/ 2.翻到页面最底部点击tools 3.页面下滑点击Download STS4 Windows 64-bit

  7. Vue2.4+新增属性.sync、$attrs、$listeners

    参考链接:https://www.jianshu.com/p/4649d317adfe

  8. 【Python基础】06_Python中的函数

    1.函数的定义 def 函数名(): 函数封装的代码 …… 注:函数前后应该保留两个空行 2.函数的使用 直接使用函数名()调用函数块. def say_hello(): print("He ...

  9. Python中的with语句(上下文管理协议)

    在平时工作中总会有这样的任务,它们需要开始前做准备,然后做任务,然后收尾清理....比如读取文件,需要先打开,读取,关闭 这个时候就可以使用with简化代码,很方便 1.没有用with语句 f = o ...

  10. golang数据基本数据类型和string类型的转换

    基本类型之间的转换 golang在不同类型的变量之间赋值时需要显式转换,也就是说golang中数据类型不能自动转换. 表达式T(v)将值v转换为类型T 1.数据类型的转换可以是从范围小——>范围 ...