关于redis的使用总结
- 简介
redis是一个开源的用c语言编写的数据库,但并不像常规的关系型数据库那样把数据存储在表中 , 而是像Java中的Map集合一样,存储的是一系列key=value键值对,redis属于NoSQL数据库(非关系型数据库)。
redis的设计初衷并不是取代传统的关系型数据库,而是作为它们的补充,在某些情况下发挥其特长。
redis数据库工作的时候会把所有的数据都读到内存中,磁盘上的数据文件只是用来持久化数据。这个特点使得redis具有极快的存取速度,但可以管理的数据量受到限制,不能超过可用的内存空间(虽然可以使用交换区,但会牺牲掉一些速度)。
- redis的内存结构
redis本身像一个map,可以直接存放键值对 ,也可以把数据以特定的数据结构组织起来,redis内部支持的数据结构有 list , set , sorted Set , hashMap
- redis做消息队列
redis有list的数据结构,天生就适合做消息队列。
使用代码简单模拟生产者、消费者如何操作消息队列
public class MQTest { // 演示消息队列的操作 public static void main(String[] args) { new Producer("蛋蛋").start(); new Producer("建国").start(); new Consumer().start(); new Consumer().start(); } } // 生产者 class Producer extends Thread { private String name; private int count = 1;// 生产消息的个数 public Producer(String name) { this.name = name; } @Override public void run() { Jedis jedis = new Jedis("localhost"); // 循环着 让生产者随机睡眠一段时间,然后生产一条消息放入到消息队列 Random random = new Random(); while (true) { try { Thread.sleep(200 + random.nextInt(1000));// 200-1200 } catch (InterruptedException e) { e.printStackTrace(); } // 生产消息 -- 用字符串表示 String message = name + "生产的第" + count + "个消息"; count++; // 把消息放入消息队列 jedis.rpush("mq", message); } } } // 消费者 class Consumer extends Thread { @Override public void run() { // 循环着,先休眠一段时间,再从消息队列中取出消息处理 Jedis jedis = new Jedis("localhost"); Random random = new Random(); while (true) { try { Thread.sleep(200 + random.nextInt(1000));// 200-1200 } catch (InterruptedException e) { e.printStackTrace(); } // 从消息队列中取出消息 String message = jedis.lpop("mq"); // 处理消息--简单的输出一下 if (message != null) { System.out.println(message); } } } }
使用消息队列记录系统的日志信息
public class LogTest { // 演示使用消息队列暂存系统日志 public static void main(String[] args) { // 模拟四个用户操作 new UserThread().start(); new UserThread().start(); new UserThread().start(); new UserThread().start(); new OtherThread().start(); } } class UserThread extends Thread { // 用户线程,模拟用户操作时产生日志信息 @Override public void run() { // 作为消息队列使用 Jedis jedis = new Jedis("localhost"); Random random = new Random(); while (true) { try { Thread.sleep(random.nextInt(1000)); } catch (InterruptedException e) { e.printStackTrace(); } // 产生日志信息 String log = "logloglog-----------"; // 把日志信息放入到消息队列 jedis.rpush("log_mq", log); } } } class OtherThread extends Thread { // 专门用来从消息队列中取数据,写入到缓冲输出流 @Override public void run() { // 消息队列 Jedis jedis = new Jedis("localhost"); // 缓冲输出流 File file = new File("h:\\system.log"); FileWriter fileWriter = null; BufferedWriter bufferedWriter = null; try { fileWriter = new FileWriter(file); bufferedWriter = new BufferedWriter(fileWriter); // 不停的从消息队列中读数据,如果读到,写入到输出流中, // 如果没有读到,不写,然后让线程“休息”一下--2秒 while (true) { // 从消息队列取出一条消息 String log = jedis.lpop("log_mq"); if (log != null) { bufferedWriter.write(log); bufferedWriter.write("\n"); System.out.println("读到了一条日记信息"); } else { // 睡眠2秒钟 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } catch (IOException e) { throw new RuntimeException(e); } finally { if (bufferedWriter != null) { try { bufferedWriter.close(); } catch (IOException e) { e.printStackTrace(); } } if (fileWriter != null) { try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
- redis常用命令列表
常用命令(如果在命令行中执行,参数没有小括号) 1)连接操作命令 quit:关闭连接(connection) auth:简单密码认证 help cmd: 查看cmd帮助,例如:help quit 2)持久化 save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsave:返回上次成功将数据保存到磁盘的Unix时戳 shundown:将数据同步保存到磁盘,然后关闭服务 3)远程服务控制 info:提供服务器的信息和统计 monitor:实时转储收到的请求 slaveof:改变复制策略设置 config:在运行时配置Redis服务器 4)对key操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key type(key):返回值的类型 keys(pattern):返回满足给定pattern的所有key randomkey:随机返回key空间的一个 keyrename(oldname, newname):重命名key dbsize:返回当前数据库中key的数目 expire:设定一个key的活动时间(s) ttl:获得一个key的活动时间 select(index):按索引查询 move(key, dbindex):移动当前数据库中的key到dbindex数据库 flushdb:删除当前选择数据库中的所有key flushall:删除所有数据库中的所有key 5)String set(key, value):把键值对存储到数据库中 get(key):返回数据库中key对应的value getset(key, value):获得key对应的当前值,然后设置新值 mget(key1, key2,…, key N):返回库中多个string的value setnx(key, value):添加string,名称为key,值为value setex(key, time, value):向库中添加string,设定过期时间time mset(key N, value N):批量设置多个string的值 msetnx(key N, value N):如果所有名称为key i的string都不存在 incr(key):名称为key的string增1操作 incrby(key, integer):名称为key的string增加integer decr(key):名称为key的string减1操作 decrby(key, integer):名称为key的string减少integer append(key, value):名称为key的string的值附加value substr(key, start, end):返回名称为key的string的value的子串 6)List rpush(key, value):在名称为key的list尾添加一个值为value的元素---------消息队列相关方法 lpush(key, value):在名称为key的list头添加一个值为value的 元素 llen(key):返回名称为key的list的长度 lrange(key, start, end):返回名称为key的list中start至end之间的元素 ltrim(key, start, end):截取名称为key的list lindex(key, index):返回名称为key的list中index位置的元素 lset(key, index, value):给名称为key的list中index位置的元素赋值 lrem(key, count, value):删除count个key的list中值为value的元素 lpop(key):返回并删除名称为key的list中的首元素------消息队列相关方法 rpop(key):返回并删除名称为key的list中的尾元素 blpop(key1, key2,… key N, timeout):lpop命令的block版本。 brpop(key1, key2,… key N, timeout):rpop的block版本。 rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部 7)Set sadd(key, member):向名称为key的set中添加元素member srem(key, member) :删除名称为key的set中的元素member spop(key) :随机返回并删除名称为key的set中一个元素 smove(srckey, dstkey, member) :移到集合元素 scard(key) :返回名称为key的set的基数 sismember(key, member) :member是否是名称为key的set的元素 sinter(key1, key2,…key N) :求交集 sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合 sunion(key1, (keys)) :求并集 sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合 sdiff(key1, (keys)) :求差集 sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合 smembers(key) :返回名称为key的set的所有元素 srandmember(key) :随机返回名称为key的set的一个元素 8)Hash hset(key, field, value):向名称为key的hash中添加元素field hget(key, field):返回名称为key的hash中field对应的value hmget(key, (fields)):返回名称为key的hash中field i对应的value hmset(key, (fields)):向名称为key的hash中添加元素field hincrby(key, field, integer):将名称为key的hash中field的value增加integer hexists(key, field):名称为key的hash中是否存在键为field的域 hdel(key, field):删除名称为key的hash中键为field的域 hlen(key):返回名称为key的hash中元素个数 hkeys(key):返回名称为key的hash中所有键 hvals(key):返回名称为key的hash中所有键对应的value hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
- redis参考网站