• 简介

redis是一个开源的用c语言编写的数据库,但并不像常规的关系型数据库那样把数据存储在表中 , 而是像Java中的Map集合一样,存储的是一系列key=value键值对,redis属于NoSQL数据库(非关系型数据库)。

redis的设计初衷并不是取代传统的关系型数据库,而是作为它们的补充,在某些情况下发挥其特长。

redis数据库工作的时候会把所有的数据都读到内存中,磁盘上的数据文件只是用来持久化数据。这个特点使得redis具有极快的存取速度,但可以管理的数据量受到限制,不能超过可用的内存空间(虽然可以使用交换区,但会牺牲掉一些速度)。

  • redis的内存结构

redis本身像一个map,可以直接存放键值对 ,也可以把数据以特定的数据结构组织起来,redis内部支持的数据结构有 list , set , sorted Set , hashMap

  • redis做消息队列

redis有list的数据结构,天生就适合做消息队列。

使用代码简单模拟生产者、消费者如何操作消息队列

  1. public class MQTest {
  2. // 演示消息队列的操作
  3. public static void main(String[] args) {
  4.  
  5. new Producer("蛋蛋").start();
  6. new Producer("建国").start();
  7.  
  8. new Consumer().start();
  9. new Consumer().start();
  10. }
  11. }
  12.  
  13. // 生产者
  14. class Producer extends Thread {
  15. private String name;
  16. private int count = 1;// 生产消息的个数
  17.  
  18. public Producer(String name) {
  19. this.name = name;
  20. }
  21.  
  22. @Override
  23. public void run() {
  24.  
  25. Jedis jedis = new Jedis("localhost");
  26.  
  27. // 循环着 让生产者随机睡眠一段时间,然后生产一条消息放入到消息队列
  28.  
  29. Random random = new Random();
  30. while (true) {
  31. try {
  32. Thread.sleep(200 + random.nextInt(1000));// 200-1200
  33. } catch (InterruptedException e) {
  34. e.printStackTrace();
  35. }
  36.  
  37. // 生产消息 -- 用字符串表示
  38. String message = name + "生产的第" + count + "个消息";
  39. count++;
  40.  
  41. // 把消息放入消息队列
  42. jedis.rpush("mq", message);
  43. }
  44. }
  45. }
  46.  
  47. // 消费者
  48. class Consumer extends Thread {
  49. @Override
  50. public void run() {
  51.  
  52. // 循环着,先休眠一段时间,再从消息队列中取出消息处理
  53. Jedis jedis = new Jedis("localhost");
  54. Random random = new Random();
  55. while (true) {
  56. try {
  57. Thread.sleep(200 + random.nextInt(1000));// 200-1200
  58. } catch (InterruptedException e) {
  59. e.printStackTrace();
  60. }
  61.  
  62. // 从消息队列中取出消息
  63. String message = jedis.lpop("mq");
  64.  
  65. // 处理消息--简单的输出一下
  66. if (message != null) {
  67. System.out.println(message);
  68. }
  69.  
  70. }
  71. }
  72. }

使用消息队列记录系统的日志信息

  1. public class LogTest {
  2.  
  3. // 演示使用消息队列暂存系统日志
  4. public static void main(String[] args) {
  5.  
  6. // 模拟四个用户操作
  7. new UserThread().start();
  8. new UserThread().start();
  9. new UserThread().start();
  10. new UserThread().start();
  11.  
  12. new OtherThread().start();
  13.  
  14. }
  15. }
  16.  
  17. class UserThread extends Thread {
  18. // 用户线程,模拟用户操作时产生日志信息
  19. @Override
  20. public void run() {
  21. // 作为消息队列使用
  22. Jedis jedis = new Jedis("localhost");
  23.  
  24. Random random = new Random();
  25.  
  26. while (true) {
  27. try {
  28. Thread.sleep(random.nextInt(1000));
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32.  
  33. // 产生日志信息
  34. String log = "logloglog-----------";
  35.  
  36. // 把日志信息放入到消息队列
  37. jedis.rpush("log_mq", log);
  38. }
  39. }
  40. }
  41.  
  42. class OtherThread extends Thread {
  43.  
  44. // 专门用来从消息队列中取数据,写入到缓冲输出流
  45. @Override
  46. public void run() {
  47.  
  48. // 消息队列
  49. Jedis jedis = new Jedis("localhost");
  50.  
  51. // 缓冲输出流
  52. File file = new File("h:\\system.log");
  53. FileWriter fileWriter = null;
  54. BufferedWriter bufferedWriter = null;
  55. try {
  56. fileWriter = new FileWriter(file);
  57. bufferedWriter = new BufferedWriter(fileWriter);
  58.  
  59. // 不停的从消息队列中读数据,如果读到,写入到输出流中,
  60. // 如果没有读到,不写,然后让线程“休息”一下--2秒
  61.  
  62. while (true) {
  63. // 从消息队列取出一条消息
  64. String log = jedis.lpop("log_mq");
  65.  
  66. if (log != null) {
  67. bufferedWriter.write(log);
  68. bufferedWriter.write("\n");
  69.  
  70. System.out.println("读到了一条日记信息");
  71. } else {
  72. // 睡眠2秒钟
  73. try {
  74. Thread.sleep(2000);
  75. } catch (InterruptedException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. }
  80.  
  81. } catch (IOException e) {
  82. throw new RuntimeException(e);
  83. } finally {
  84. if (bufferedWriter != null) {
  85. try {
  86. bufferedWriter.close();
  87. } catch (IOException e) {
  88. e.printStackTrace();
  89. }
  90. }
  91.  
  92. if (fileWriter != null) {
  93. try {
  94. fileWriter.close();
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. }
  100. }
  101. }
  • redis常用命令列表
  1. 常用命令(如果在命令行中执行,参数没有小括号)
  2.  
  3. 1)连接操作命令
  4. quit:关闭连接(connection
  5. auth:简单密码认证
  6. help cmd 查看cmd帮助,例如:help quit
  7.  
  8. 2)持久化
  9. save:将数据同步保存到磁盘
  10. bgsave:将数据异步保存到磁盘
  11. lastsave:返回上次成功将数据保存到磁盘的Unix时戳
  12. shundown:将数据同步保存到磁盘,然后关闭服务
  13.  
  14. 3)远程服务控制
  15. info:提供服务器的信息和统计
  16. monitor:实时转储收到的请求
  17. slaveof:改变复制策略设置
  18. config:在运行时配置Redis服务器
  19.  
  20. 4)对key操作的命令
  21. exists(key):确认一个key是否存在
  22. del(key):删除一个key
  23. type(key):返回值的类型
  24. keys(pattern):返回满足给定pattern的所有key
  25. randomkey:随机返回key空间的一个
  26. keyrename(oldname, newname):重命名key
  27. dbsize:返回当前数据库中key的数目
  28. expire:设定一个key的活动时间(s
  29. ttl:获得一个key的活动时间
  30. select(index):按索引查询
  31. move(key, dbindex):移动当前数据库中的keydbindex数据库
  32. flushdb:删除当前选择数据库中的所有key
  33. flushall:删除所有数据库中的所有key
  34.  
  35. 5String
  36. set(key, value):把键值对存储到数据库中
  37. get(key):返回数据库中key对应的value
  38. getset(key, value):获得key对应的当前值,然后设置新值
  39. mget(key1, key2,…, key N):返回库中多个stringvalue
  40. setnx(key, value):添加string,名称为key,值为value
  41. setex(key, time, value):向库中添加string,设定过期时间time
  42. mset(key N, value N):批量设置多个string的值
  43. msetnx(key N, value N):如果所有名称为key istring都不存在
  44. incr(key):名称为keystring1操作
  45. incrby(key, integer):名称为keystring增加integer
  46. decr(key):名称为keystring1操作
  47. decrby(key, integer):名称为keystring减少integer
  48. append(key, value):名称为keystring的值附加value
  49. substr(key, start, end):返回名称为keystringvalue的子串
  50.  
  51. 6List
  52. rpush(key, value):在名称为keylist尾添加一个值为value的元素---------消息队列相关方法
  53. lpush(key, value):在名称为keylist头添加一个值为value 元素
  54. llen(key):返回名称为keylist的长度
  55. lrange(key, start, end):返回名称为keyliststartend之间的元素
  56. ltrim(key, start, end):截取名称为keylist
  57. lindex(key, index):返回名称为keylistindex位置的元素
  58. lset(key, index, value):给名称为keylistindex位置的元素赋值
  59. lrem(key, count, value):删除countkeylist中值为value的元素
  60. lpop(key):返回并删除名称为keylist中的首元素------消息队列相关方法
  61. rpop(key):返回并删除名称为keylist中的尾元素
  62. blpop(key1, key2,… key N, timeout):lpop命令的block版本。
  63. brpop(key1, key2,… key N, timeout):rpopblock版本。
  64. rpoplpush(srckey, dstkey):返回并删除名称为srckeylist的尾元素,并将该元素添加到名称为dstkeylist的头部
  65.  
  66. 7Set
  67. sadd(key, member):向名称为keyset中添加元素member
  68. srem(key, member) :删除名称为keyset中的元素member
  69. spop(key) :随机返回并删除名称为keyset中一个元素
  70. smove(srckey, dstkey, member) :移到集合元素
  71. scard(key) :返回名称为keyset的基数
  72. sismember(key, member) member是否是名称为keyset的元素
  73. sinter(key1, key2,…key N) :求交集
  74. sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
  75. sunion(key1, (keys)) :求并集
  76. sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
  77. sdiff(key1, (keys)) :求差集
  78. sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
  79. smembers(key) :返回名称为keyset的所有元素
  80. srandmember(key) :随机返回名称为keyset的一个元素
  81.  
  82. 8Hash
  83. hset(key, field, value):向名称为keyhash中添加元素field
  84. hget(key, field):返回名称为keyhashfield对应的value
  85. hmget(key, (fields)):返回名称为keyhashfield i对应的value
  86. hmset(key, (fields)):向名称为keyhash中添加元素field
  87. hincrby(key, field, integer):将名称为keyhashfieldvalue增加integer
  88. hexists(key, field):名称为keyhash中是否存在键为field的域
  89. hdel(key, field):删除名称为keyhash中键为field的域
  90. hlen(key):返回名称为keyhash中元素个数
  91. hkeys(key):返回名称为keyhash中所有键
  92. hvals(key):返回名称为keyhash中所有键对应的value
  93. hgetall(key):返回名称为keyhash中所有的键(field)及其对应的value
  • redis参考网站

http://redisdoc.com

关于redis的使用总结的更多相关文章

  1. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  2. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  3. mac osx 安装redis扩展

    1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis   ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...

  4. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  5. Redis数据库

    Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...

  6. redis 学习笔记(2)

    redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...

  7. redis 学习笔记(1)

    redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...

  8. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

  9. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  10. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

随机推荐

  1. Flink笔记(二) DataStream Operator(数据流操作)

    DataStream Source 基于文件 readTextFile(path) 读取 text 文件的数据 readFile(fileInputFormat, path) 通过自定义的读取方式, ...

  2. weex框架

    weex优势: (1)支持ES6规范 (2)性能优异,开发简介标准,提及小巧. (3)跨平台 weex调试工具:weexplayground weex环境搭建: (1)安装 node.js.npm ( ...

  3. python---函数定义、调用、参数

    1.函数定义和调用 下面def test部分的代码块是函数定义:test(2,3)则是函数调用 def test(a,b): print(a) print(b) test(,) 2.必填参数,即函数调 ...

  4. 面向对象-接口(interface)实战案例

    面向对象-接口(interface)实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口(interface)概述 1>.接口的语法格式 接口时抽象类的一种特殊体 ...

  5. HDU - 5898 odd-even number (数位dp)

    题意:求一个区间内,满足连续的奇数长度是偶数,连续的偶数长度是奇数的数的个数. #include<cstdio> #include<cstring> #include<c ...

  6. js实现鼠标单击或者双击事件

    // timer为全局变量 getClickEmail1(_type) { clearTimeout(this.timer); if (_type == 1) { if (event.detail = ...

  7. Java中多态的实例

    public class cf { /** * 实际上这里涉及方法调用的优先问题, * 优先级由高到低依次为:this.show(O).super.show(O).this.show((super)O ...

  8. UVALive 3634 数据结构模拟

    这题真是坑啊,题意不明,其实就是往桟里面压入空的set集合,所以之前的询问大小都是只有0,只有add的时候,才会产生新的占空间的集合 用stack和set直接进行模拟 #include <ios ...

  9. 如何搞定Critical Thinking写作?

    受中国传统教育模式与国外一流大学之间的差异的影响,在海外留学的学子们常常会在新的学习生活中面临许多难题,Critical Thinking就是其中之一.国内的教育方法常常以灌输式的教育模式为主,忽略了 ...

  10. 吴裕雄--天生自然 PHP开发学习:数据类型

    <?php $x = "Hello world!"; echo $x; echo "<br>"; $x = 'Hello world!'; e ...