关于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组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...
随机推荐
- Flink笔记(二) DataStream Operator(数据流操作)
DataStream Source 基于文件 readTextFile(path) 读取 text 文件的数据 readFile(fileInputFormat, path) 通过自定义的读取方式, ...
- weex框架
weex优势: (1)支持ES6规范 (2)性能优异,开发简介标准,提及小巧. (3)跨平台 weex调试工具:weexplayground weex环境搭建: (1)安装 node.js.npm ( ...
- python---函数定义、调用、参数
1.函数定义和调用 下面def test部分的代码块是函数定义:test(2,3)则是函数调用 def test(a,b): print(a) print(b) test(,) 2.必填参数,即函数调 ...
- 面向对象-接口(interface)实战案例
面向对象-接口(interface)实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口(interface)概述 1>.接口的语法格式 接口时抽象类的一种特殊体 ...
- HDU - 5898 odd-even number (数位dp)
题意:求一个区间内,满足连续的奇数长度是偶数,连续的偶数长度是奇数的数的个数. #include<cstdio> #include<cstring> #include<c ...
- js实现鼠标单击或者双击事件
// timer为全局变量 getClickEmail1(_type) { clearTimeout(this.timer); if (_type == 1) { if (event.detail = ...
- Java中多态的实例
public class cf { /** * 实际上这里涉及方法调用的优先问题, * 优先级由高到低依次为:this.show(O).super.show(O).this.show((super)O ...
- UVALive 3634 数据结构模拟
这题真是坑啊,题意不明,其实就是往桟里面压入空的set集合,所以之前的询问大小都是只有0,只有add的时候,才会产生新的占空间的集合 用stack和set直接进行模拟 #include <ios ...
- 如何搞定Critical Thinking写作?
受中国传统教育模式与国外一流大学之间的差异的影响,在海外留学的学子们常常会在新的学习生活中面临许多难题,Critical Thinking就是其中之一.国内的教育方法常常以灌输式的教育模式为主,忽略了 ...
- 吴裕雄--天生自然 PHP开发学习:数据类型
<?php $x = "Hello world!"; echo $x; echo "<br>"; $x = 'Hello world!'; e ...