关于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参考网站
关于redis的使用总结的更多相关文章
- 使用redis构建可靠分布式锁
关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...
- Ignite性能测试以及对redis的对比
测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...
- mac osx 安装redis扩展
1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- Redis数据库
Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...
- redis 学习笔记(2)
redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...
- redis 学习笔记(1)
redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...
- python+uwsgi导致redis无法长链接引起性能下降问题记录
今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
随机推荐
- SpringBoot学习(五)——Profile
Profile是Spring对不同环境(例如开发人用开发环境,测试人员用测试环境)提供不同配置功能的支持,可以通过激活,指定参数等方式快速切换环境 1.多profile文件形式 格式:applicat ...
- 第一部分 JavaScript语言核心(四)
第九章 类和模块 P235 组合VS子类:组合优于继承 P236 类的层次结构和抽象类 第十章 正则达式的模式匹配 定义 JS中正则表达式用RegExp对象表示.直接量定义为包含在一堆斜杠(/)之间的 ...
- 【PentestBox】rubygems.rb erorr
PentestBox可以在windows下运行一些Linux系统命令,但仍然基于windows. 若使用msfconsole或者gem命令是出现: internal:gem_prelude:1:in ...
- 【LeetCode】验证二叉搜索树
[问题]给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是二叉搜 ...
- 剑指offer_1.19_Day_3
替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. Javascript_V8 f ...
- swift中实现cell中局部播放的动画效果
在cell中 // 播放器动画效果 private var replicatorLayer:ReplicatorLayer = { let layer = ReplicatorLayer.init(f ...
- 给指定的div增加滚动条
这次的需求是给一个指定的div(里面有个table表格)增加上下.左右的滚动条 通过查找资料后找到了一个可用的方法,代码如下: <!--div比table大小要小才会显示--> <d ...
- markdown使用介绍
一.标题,前面加#,加一个 一级标题,两个二级标题,以此类推. 一级标题 二级标题 三级标题
- 读书笔记 - javascript 高级程序设计 - 第一章 简介
第一章 简介 诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262 一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...
- 云服务器Linux版本下---安装git
xshell进入云服务器: 按照git官网:https://git-scm.com/download/linux 的教程输入: apt-get install git 本地没有包????? 原来是 ...