• 简介

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参考网站

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. 深度解析Critical Thinking的四个阶段

    关于批判性思维我们一直都在讨论学习,但是小编相信没有几个留学生敢说自己有Critical Thinking,但它又是essay写作中必须存在的.那么批判性思维需要怎么培养呢?今天小编就给同学们分析一下 ...

  2. GDI+3

    关于这个的例子其实网上已经有这方面的资料了,但是为了文章的完整性,还是觉得有必要讲解.我们先来看一下效果:     ( 图2 )接下来看看这是如何做到的. 思路:聊天窗体上有一个截图按钮,点击按钮后, ...

  3. 21 ~ express ~ 内容详情展示 和 阅读数处理

    1,前台 ,/views/main/index.html ,将文章 id 通过url 传送给后台 {% for content in contents %} <div class="p ...

  4. JavaScript面试题(转)

    JS相关问题 数组去重 function uniq(array){ var temp = []; //一个新的临时数组 for(var i = 0; i < array.length; i++) ...

  5. 【LeetCode】最小路径和

    [问题]给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [,,], [,,], [, ...

  6. TP中统计指定字段的总数

    如统计已激活设备数量和未激活设备数量 $condition = [ ['member_id', '=', $member_id] ]; $field = [ 'COUNT(IF(active_memb ...

  7. HDU 1226 超级密码(BFS) (还需研究)

    Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Desc ...

  8. Maven - web 实例

    版权所有,未经授权,禁止转载 章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven – pom.xml 文件 Maven – 依赖管理 Ma ...

  9. Golang---sort包

    Sort 包介绍 Go 语言标准库 sort 包中实现了几种基本的排序算法:插入排序.快速排序和堆排序,但是在使用 sort 包进行排序时无需具体考虑使用哪种排序方式,因为该方法会根据传入的排序的数据 ...

  10. Sequence Models Week 1 Character level language model - Dinosaurus land

    Character level language model - Dinosaurus land Welcome to Dinosaurus Island! 65 million years ago, ...