Redis学习总结-入门

91 阅读6分钟

Redis是什么?


Redis是一个开源(BSD许可)的使用ANSI C语言编写的,支持网络,可以基于内存亦可持久化的日志型,key-value数据库,并提供多种语言的API。

支持多种类型的数据结构:

  • 字符串(strings)
  • 散列(hashes)
  • 列表(lists)
  • 集合(sets)
  • 有序集合(sorted sets)

特点:

  • 性能极高:能读的速度是110000次/s,写的速度是81000次/s。
  • 丰富的数据类型:支持二进制的Strings, Lists, Hashes, Sets及Ordered Sets数据类型操作。
  • 原子性:所有的操作都原子性的,单个操作支持事务,多个操作也支持事务。
  • 丰富的特性:支持publish/subscribe, 通知, key过期等特性。

发展历程


2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久,该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。 不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。 Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。 VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。

官网:redis.io/

Redis使用标准版本标记进行版本控制:major.minor.patchlevel。偶数的版本号表示稳定版本,如1.2,2.0等,奇数的版本号用来表示非标准版本,如2.9.x是非稳定版本,它的稳定版本是3.0。目前最新的版本是5.0.5。

使用场景


目前接触过的场景有下面几个:

  • 内容缓存:由于Redis访问速度比较快,将热点数据放到Redis里,提升查询速度。
  • 消息队列:Redis有list push和list pop这样的命令,所以很方便的执行队列操作。但是需要注意持久化,同时因为还没有ack, 可能存在丢消息的情况。
  • 分布式锁:基于Redis的原子性,可以用来做分布式锁。

Redis的安装


Redis支持windows及linux下安装。

  • windows的安装:Redis没有官方的windows版本,但是微软开源技术团队开发和维护着一个win64的版本,下载地址是:github.com/microsoftar…
  1. 下载安装包,下载的是3.0.504。解压后,通过cmd运行
redis-server.exe redis.windows.conf 

2. 在使用之前需要修改一下密码。cmd运行redis-cli.exe。通过输入 config set requirepass "yourpassword" 修改密码。 3. 通过RedisDesktopManager就可以连接上Redis了。

4. 如果想用命令行操作,可以另启动一个cmd,输入下面命令进行操作。

redis-cli.exe -h 127.0.0.1 -p 6379
//运行上面会报提示需要密码,输入密码即可,我之前设置的密码是1234
auth 1234
//设置键值对
set test abc
//取得键值对
get test

结果如下:

  • linux下的安装:参考官方文档里的说明。
  1. 下载,解压并编译redis
$ wget http://download.redis.io/releases/redis-5.0.5.tar.gz
$ tar xzf redis-5.0.5.tar.gz
$ cd redis-5.0.5
$ make
  1. 编译完成后,在src目录下面会有redis的服务程序redis-server跟客户端测试程序redis-cli
$ cd src
$ ./redis-server ../redis.conf

这样就把redis server运行起来了。

3.测试验证一下

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

得到的结果如下:

Redis的使用


  • 代码集成方式:Redis支持java, C, C#, C++, php, Node.js, Go等客户端,官方网站中,java客户端推荐的有Jedis, Redisson, lettuce。
  • spring boot集成Jedis: Jedis的连接方式有三种Jedis/JedisPool连接(单机的操作),SharedJedis/SharededJedisPool连接(分布式操作),JedisCluster连接(集群操作)。后面展示的是Jedis/JedisPool的用法。
  • Jedis:直接tcp连接,底层用的是socket, 简单方便,适用于少量长期少量长期连接的场景,缺点是每次新建/关闭TCP开销,资源无法控制,存在连接泄露的可能,Jedis对象线程不安全
  • JedisPool:Jedis预先生成,降低开销,连接池的形式保护和控制资源的使用,缺点在于使用起来比较麻烦,在资源管理上需要很多参数来保证,一旦规划不合理也会出现问题。 用法如下:
  1. pom文件引用Jedis
    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>3.0.1</version>
    </dependency>
  1. 代码里就可以直接用了
 public void redisTest(){
 //JedisPool默认的构造函数,host是127.0.0.1,port:6379
 //一般情况下需要设置JedisPoolConfig里的各种参数
    JedisPool jedisPool = new JedisPool();
    Jedis jedis = null;
    String strValue = null;
    try
    {
      jedis = jedisPool.getResource();
      jedis.select(0);
      strValue = jedis.get("test");
      System.out.print(strValue);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
  }

3.如果用Jedis进行操作话,代码会更简单。

  public void redisTest2(){
    Jedis jedis = new Jedis("127.0.0.1",6379);
  //  jedis.auth("1234");
    jedis.connect();
    String strValue = jedis.get("test");
    System.out.print(strValue);
    //关闭连接
    jedis.disconnect();
  }

实际项目中,根据需要一般会对Jedis进行封装,将配置信息放在配置文件里。

Redis相关工具集


  • 内存分析工具:github.com/xueqiu/rdr. 如果出现Redis内存占用过大,可以通过此工具分析出哪个键占用内存最多。
  • redis迁移用redis-Migrate-tool(RMT),它是唯品会开源的redis数据迁移工具,主要用于异构redis集群间的数据迁移,即数据迁移过程中源集群仍可正常接受业务读写请求,无服务中断时间。需要一个redis迁移服务器。

Redis的研发实践


  • 设计规范的key名:key的名称需要有可读性,通过key名可以了解到这个值的作用;在保证语义的情况下,控制key的长度,当key比较多的时候,内存的占用也不容忽视;不要包含特殊的字符。
  • 选择合适的集合类:使用sortedset、set、list、hash等集合类的O(N)操作时要评估当前元素个数的规模以及将来的增长规模,对于短期就可能变为大集合的key,要预估O(N)操作的元素数量, 避免全量操作,可以使用HSCAN、SSCAN、ZSCAN进行渐进操作。集合元素数量过大在使用过程中会影响redis的实际性能,元素个数建议尽量不要超过3000,元素数量过大可 考虑拆分成多个key进行处理。
  • 网络引发的延迟优化:使用连接池;使用批处理操作。
  • 合理设置过期时间:小key单独设置过期时间(不要集中过期),hash/set/zset/list集合类元素过多,由于只能设置集合本身的过期时间,需要自己设计过期方法,通过hscan、sscan、zscan方式渐进式删除,降低阻塞时间。

下一步计划


  • 目前正在看Redis的原理分析,一直比较好奇为什么Redis能做到如此之快,还有通过看实现的原理,可以知道日常使用中该有哪些注意,哪些操作会影响Redis的性能。
  • 上面总结只是Redis单机的学习,Redis可以做集群,会涉及到主从复制等内容,暂时还没有看。
  • Redis的研发实践总结的还比较少,毕竟还没有了解那么深。
  • Redis问题定位这块还欠缺,后面过程中多总结。