• 简介

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. JVM学习与问题总结——java内存区域与内存溢出异常

    java虚拟机将内存分为哪些区域? 根据Java SE7版本的Java虚拟机规范,虚拟机管理的内存包括5个运行时数据区域: 程序计数器 虚拟机栈 本地方法栈 方法区 堆 运行时数据区各部分的作用? 程 ...

  2. spring boot 开发环境搭建(Eclipse)

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  3. kibana下载与安装

    目录 简介 下载 安装 测试 简介 Kibana是一个为ElasticSearch 提供的数据分析的 Web 接口.可使用它对日志进行高效的搜索.可视化.分析等各种操作.安装之前有话说: 安装路径不要 ...

  4. c++程序—while猜数字游戏

    #include<iostream> using namespace std; #include<string> #include<ctime> int main( ...

  5. Linux重要命令练习之bc

  6. EE将于5月30日在英国推出首个5G网络

    英国移动运营商 EE 宣布计划于周三在英国推出 5G,该网络将于 5 月 30 日开通,第一批 5G 手机可从今天开始预订.EE 最初的 5G 网络部署将集中在六个城市(伦敦,加的夫,爱丁堡,贝尔法斯 ...

  7. cf 444C.

    听说这是线段树的裸题??(看来我也就能搞个求和什么的了2333) #include<bits/stdc++.h> #define INF 0x7fffffff #define LL lon ...

  8. 2019 年 Google 编程之夏活动报告

    2019 年 Google 编程之夏活动报告 主要介绍了 GSoC 2019 活动的几个课题并讲述了整个活动的组织过程 Google 编程之夏活动不仅仅是一个夏日的实习项目,对于组织和一些社区的成员来 ...

  9. C++ 一般模板友元关系

    //一般模板友元关系 #include "stdafx.h" #include <iostream> using namespace std; template< ...

  10. 工程日记之HelloSlide(3):如何使用Core Data数据库,以及和sqlite之间的对应关系

    Core Data 和 SQLite 是什么关系 core data是对sqlite的封装,因为sqlite是c语言的api,然而有人也需要obj-c的api,所以有了core data ,另外,co ...