当前位置:文档之家› Redis数据库简介

Redis数据库简介

Redis数据库简介
Redis数据库简介

介绍

Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)与范围查询, bitmaps, hyperloglogs 和地理空间(geospatial)索引半径查询。 Redis 内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence),并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

版本

官方版本

目前官方版本支持Linux系统和Ubuntu系统。官方下载地址:

http://redis.io/download

由于我们的开发项目以Windows为主,所以在此不对官方版本做详细介绍,有兴趣的可以到官网查看。 #### 非官方版本(Windows 版本)官方没有Redis的Windows版本,但是微软开源技术团队(Microsoft Open Tech group)自行开发和维护了一个Win64的版本。

- 微软团队只提供了官方64位版本,而32位版本,需要自己从源代码构建。 - Released版本中提供了msi文件,Redis可以作为Windows服务安装

安装服务

?下载Win64的压缩文件到一个指定文件夹

?打开一个 cmd 窗口使用cd命令切换目录到解压缩的文件夹下运行redis-server.exe redis.windows.conf

?redis-server.exe启动Redis服务

?redis.windows.conf Redis服务的一些配置,不写则会调用默认设置

?端口号默认6379可以通过修改配置文件redis.windows-service.conf修改或CONFIG set命令修改

运行客户端

?打开一个 cmd 窗口使用cd命令切换目录到解压缩的文件夹运行redis-cli.exe -h 127.0.0.1 -p 6379

?redis-cli.exe启动Redis客户端

?-h 127.0.0.1服务器IP地址

?-p 6379服务器端口号

优点

1.速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找

和操作的时间复杂度都是O(1)

2.支持丰富数据类型,支持string(字符串),hash(哈希),list(列表),

set(集合)及zset(sorted set:有序集合)。

3.支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,

要么全部不执行

4.丰富的特性,可用于缓存,消息,按key设置过期时间,过期后将会自动删

缺点

1.redis存储成本高(纯使用内存,单台机器,存储的数据量,跟机器本身的内

存大小有关),所以不能当做海量数据库来用。虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。

2.如果进行完整重同步,由于需要生成rdb文件,并进行传输,会占用主机的

CPU,并会消耗现网的带宽。不过redis2.8版本,已经有部分重同步的功能,但是还是有可能有完整重同步。比如,新上线的备机。

3.修改配置文件,进行重启,将硬盘中的数据加载进内存,时间比较久。在这个

过程中,redis不能提供服务。

适合应用场景

redis是一种k/v的内存数据库,适合小数据量的存储以及实时要求高的地方,用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度,但是不适合做完整数据库,完整数据库基本上都有一套详细解决方案。 - 取最新的N个数据的操作 - 排行榜取TOP N

的操作 - 需要精确设定过期时间的应用(Redis可以通过setex命令设置过期时间) - 计数器应用 - Unique操作,排重 - 实时消息系统 - 构建队列系统 - 缓存

Java 使用 Redis

安装

1.安装 Redis 服务

2.配置 Java 运行环境,确保能正常使用Java

3.安装 Java Redis 驱动jedis.jar

连接到 redis 服务

import redis.clients.jedis.Jedis;

public class RedisJava {

public static void main(String[] args) {

//连接本地的 Redis 服务

Jedis jedis = new Jedis("localhost");

System.out.println("连接成功");

//查看服务是否运行

System.out.println("服务正在运行: "+jedis.ping());

}

}

存取String类型的数据

import redis.clients.jedis.Jedis;

public class RedisStringJava {

public static void main(String[] args) {

//连接本地的 Redis 服务

Jedis jedis = new Jedis("localhost");

System.out.println("连接成功");

//设置 redis 字符串数据

jedis.set("runoobkey", "https://www.doczj.com/doc/65810226.html,");

// 获取存储的数据并输出

System.out.println("redis 存储的字符串为: "+ jedis.get("runoobke y"));

}

}

编译结果:

连接成功

redis 存储的字符串为: https://www.doczj.com/doc/65810226.html,

存取List类型的数据

import java.util.List;

import redis.clients.jedis.Jedis;

public class RedisListJava {

public static void main(String[] args) {

//连接本地的 Redis 服务

Jedis jedis = new Jedis("localhost");

System.out.println("连接成功");

//存储数据到列表中

jedis.lpush("site-list", "Runoob");

jedis.lpush("site-list", "Google");

jedis.lpush("site-list", "Taobao");

// 获取存储的数据并输出

List list = jedis.lrange("site-list", 0 ,2);

for(int i=0; i

System.out.println("列表项为: "+list.get(i));

}

}

}

编译结果:

连接成功

列表项为: Taobao

列表项为: Google

列表项为: Runoob

存取的Keys

import java.util.Iterator;

import java.util.Set;

import redis.clients.jedis.Jedis;

public class RedisKeyJava {

public static void main(String[] args) {

//连接本地的 Redis 服务

Jedis jedis = new Jedis("localhost");

System.out.println("连接成功");

// 获取数据并输出

Set keys = jedis.keys("*");

Iterator it=keys.iterator() ;

while(it.hasNext()){

String key = it.next();

System.out.println(key);

}

}

}

编译结果:

连接成功

runoobkey

site-list

Redis发布与订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。#### 订阅频道通过SUBSCRIBE命令客户端可以订阅指定的频道,当这个频道有其他客户端推送的消息时,当前客户端就会收到。例:订阅first和second频道

SUBSCRIBE first second

消息推送

通过PUBLISH命令客户端可以向指定频道推送消息,订阅这个频道的客户端都会收到一条message类型的消息。例:推送消息"Hello"到first频道

PUBLISH first "Hello"

退订频道

通过UNSUBSCRIBE命令客户端可以推定指定频道。如果没有频道被指定,即一个无参数的 UNSUBSCRIBE 调用被执行,那么客户端使用SUBSCRIBE命令订阅的所有频道都会被退订。在这种情况下,命令会返回一个信息,告知客户端所有被退订的频道。例:退订second频道

UNSUBSCRIBE second

模式匹配

Redis的Pub/Sub实现支持模式匹配。客户端可以订阅全风格的模式以便接收所有来自能匹配到给定模式的频道的消息。 - 模式匹配订阅命令PSUBSCRIBE - 模式匹配退订命令UNPSUBSCRIBE - 接收消息为pmessage类型

SUBSCRIBE first

PSUBSCRIBE f*

PSUBSCRIBE news.*

注意:如果它订阅的多个模式匹配了同一个发布的消息,客户端可能多次接收一个消息。 #### JAVA实现Redis消息推送 1. 创建一个频道的监听类继承Redis的抽象类JedisPubSub,并实现其抽象方法。订阅频道,取消订阅,收到消息等状态会对应调用相关的方法。 2. 订阅频道

public class TestSubscribe {

public static void main(String[] args) {

//连接本地的 Redis 服务

Jedis jedis = new Jedis("localhost");

System.out.println("连接成功");

// 创建频道监听对象

RedisMsgPubSubListener listener = new RedisMsgPubSubListener ();

// 订阅频道,绑定监听

jedis.subscribe(listener, "redisChatTest");

}

}

注意:subscribe是一个阻塞的方法,在取消订阅该频道前,会一直阻塞在这,只有当取消了订阅才会执行之后的代码。

3.发送消息

Public class TestPublish {

public static void main(String[] args) {

Jedis jedis = new Jedis("localhost");

jedis.publish("redisChatTest", "Hello");

Thread.sleep(5000);

jedis.publish("redisChatTest", "Redis");

Thread.sleep(5000);

jedis.publish("redisChatTest", "Message publish");

}

}

4.退订频道

import redis.clients.jedis.JedisPubSub;

public class RedisMsgPubSubListener extends JedisPubSub {

...

@Override

public void onMessage(String channel, String message) {

System.out.println("channel:" + channel + "receives message : " + message);

// 退订

this.unsubscribe();

}

...

}

redis中文手册

Skip to comments (0) 排头兵 Evangelist PHP / Blogger Live in Shanghai Work@https://www.doczj.com/doc/65810226.html, Email@shjuto(at)https://www.doczj.com/doc/65810226.html, More 国内的开放平台就是一个玩笑 分享会-高性能nosql数据库redis 盛大在线跨站攻击分享会 Bambook 知识和文化传承的载体 加入盛大在线 efish 在 国内的开放平台就是一个玩笑 上的评论 最弱网 在 加入盛大在线 上的评论 大大的小蜗牛 在 国内的开放平台就是一个玩笑 上的评论 youstar 在 国内的开放平台就是一个玩笑 上的评论 wss8848 在 国内的开放平台就是一个玩笑 上的评论 CSS FreeBSD jquery memcached MySQL nginx NOSQL PHP SEO技术 SEO新闻 人在江湖 团队管理 我看互联网 碎言碎语 网站设计 最近文章 最近评论 分类目录

我看互联网 碎言碎语 网站设计 网站运营 网络营销 文章索引模板2010年十一月 2010年九月 2010年八月 2010年七月 2010年六月 2010年五月 2010年三月 2010年二月 2010年一月 2009年十二月 2009年六月 2009年五月 2009年四月 2009年三月 2009年一月 2008年十二月 2008年十一月 2008年十月 2008年九月 2008年八月 2008年七月 2008年六月 2008年五月 2008年四月 2008年三月 2007年九月 2007年八月 2007年四月 2006年七月 链接 Jackzou omiga PHPPAN Reco Lee Show Framework suppermen Tino Web开发 一亩三分地 五四陈科学院 伊人莫公 哥学社 恋上E人 某人的栖息地 武林 精神鸦片

redis千万级数据性能测试

Redis千万级的数据量的性能测试 发布时间:2011-04-06 16:21:31 来源:未知评论:点击:1609 次【字号:】 从图中可以猜测到还会有Redis 2.2.1 的测试,相同的测试环境,1K的数据量,使用ServiceStack.Redis 客户端进行如下测试:1) Set操作2) Get操作3) Del操作每一套测试分别使用三个配置进行测试:1) 绿色线条的是开启Dump方式的持久化,5分钟持久化一次2) 从图中可以猜测到还会有Redis 2.2.1 的测试,相同的测试环境,1K的数据量,使用ServiceStack.Redis客户端进行如下测试: 1) Set操作 2) Get操作 3) Del操作 每一套测试分别使用三个配置进行测试: 1) 绿色线条的是开启Dump方式的持久化,5分钟持久化一次 2) 蓝色线条是开启AOF方式的持久化,每秒写入磁盘一次 3) 红色线条是关闭任何的持久化方式 对于每一个配置都使用相同的其他配置: 1) 开启VM 最大内存10GB(128字节一页)之后开始换出,VM空间160GB 2) 最大使用内存15GB,确保在Dump的时候有足够的剩余内存 3) 开启压缩,没有配置主从 现在来看一下测试结果: 从这个图中可以看出: 1) 对于没有持久化的方式,读写都在数据量达到800万的时候,性能下降几倍,此时正好是达到内存10G,Redis开始换出到磁盘的时候。并且从那以后再也没办法重新振作起来,性能比Mongodb还要差很多。

2) 对于AOF持久化的方式,总体性能并不会比不带持久化方式差太多,都是在到了千万数据量,内存占满之后读的性能只有几百。 3) 对于Dump持久化方式,读写性能波动都比较大,可能在那段时候正在Dump也有关系,并且在达到了1400万数据量之后,读写性能贴底了。在Dump的时候,不会进行换出,而且所有修改的数据还是创建的新页,内存占用比平时高不少,超过了15GB。而且Dump还会压缩,占用了大量的CPU。也就是说,在那个时候内存、磁盘和CPU的压力都接近极限,性能不差才怪。 总结一下: 1) Redis其实只适合作为缓存,而不是数据库或是存储。它的持久化方式适用于救救急啥的,不太适合当作一个普通功能来用。对于这个版本的Redis,不建议使用任何的持久化方式。否则到时候可能会死的比较难看。说白了,期望Redis是memcached的升级版,带有各种数据结构,但是不要期望Redis来和Mongodb/Kt等来比。 2) 对于VM其实也是不建议开启,虽然开启VM可以让Redis保存比内存更多的数据,但是如果冷热数据不是很明显的话性能会非常差(我的测试都是随机查询Key,冷热不明显)。当然,对于冷热明显的情况下可以设置200% - 400%的内存作为VM空间,也不建议设置10倍的内存空间作为VM(像我的配置一样)。 3) ServiceStack.Redis客户端好像有几个Bug,首先RedisTypedClient的Dispose居然没有实现,应该是要调用client.Dispose(),其次RedisNativeClient的Info属性不是每次都获取最新值的,第三PooledRedisClientManager的WritePoolIndex和ReadPoolIndex 只看到加没看到减的地方,也不知道这是干啥的,其实每次都取第一个不是Active的Client 就可以了,PooledRedisClientManager也没有把超时使用的Active的Client强制回收(避免使用的时候忘记Dispose占用过多的连接)。有关这几点,我会尝试联系ServiceStack.Redis 的作者。

Redis数据库安装使用说明

Redis数据库安装使用说明 Redis数据库安装使用说明 Windows 安装说明 下载 文件 配置 启动 CentOS 安装说明 下载 安装 配置 启动 关闭 redis-py 检测 安装 说明 官方网站 Windows 安装说明 Windows下启动请使用Administrator账户 下载

请点击这里选择需要下载的版本 Windows版本只是为了开发使用,正式环境请选择在Linux下安装使用文件 程序说明 redis-benchmark.exe Redis性能测试工具 redis-check-aof.exe数据修复 redis-check-dump.exe检查导出工具 redis-cli.exe Redis客户端 redis-server.exe Redis服务器 redis.windows.conf配置文件 配置 配置文件为 redis.windows.conf 主要修改以下几个参数: 内网运行,建议不设置认证密码 port6379#端口,默认为6379 logfile"redis.log"#日志文件

dbfilename dump.rdb #数据库文件 maxheap1024000000#修改为该值即可 dir ./ #路径(当前目录下) 启动 进入控制台,并跳转到reids-server.exe目录下,输入以下命令即可: redis-server redis.windows.conf 设置快捷启动 在redis程序文件夹下创建StartRedisDB.bat文件,并写入如下内容 redis-server redis.windows.conf pause 保存即可,下次可以直接点击运行Redis服务端 CentOS 安装说明 如果安装使用过,请使用你自己的方法;如果没有安装使用过,请根据我的步骤安装

Redis中统计各种数据大小的方法

如果MySQL 数据库比较大的话,我们很容易就能查出是哪些表占用的空间;不过如果Redis 内存比较大的话,我们就不太容易查出是哪些(种)键占用的空间了。 有一些工具能够提供必要的帮助,比如redis-rdb-tools 可以直接分析RDB 文件来生成报告,可惜它不能百分百实现我的需求,而我也不想在它的基础上二次开发。实际上开发一个专用工具非常简单,利用SCAN 和DEBUG 等命令,没多少行代码就能实现:代码如下: <?php $patterns = array( 'foo:.+', 'bar:.+', '.+', ); $redis = new Redis(); $redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY); $result = array_fill_keys($patterns, 0); while ($keys = $redis->scan($it, $match = '* } } } } var_dump($result); ?> 当然,前提是你需要提前总结出可能的键模式,简单但不严谨的方法是MONITOR:代码如下: shell> /path/to/redis-cli monitor | awk -F '"' '$2 ~ "ADD|SET|STORE|PUSH" {print $4}' 此外,需要注意的是:因为DEBUG 返回的serializedlength 是序列化后的长度,所以最终计算的值小于实际内存占用,但考虑到相对大小依然是有参考意义的。 更多信息请查看IT技术专栏

Redis数据库简介

介绍 Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)与范围查询, bitmaps, hyperloglogs 和地理空间(geospatial)索引半径查询。 Redis 内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence),并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。 版本 官方版本 目前官方版本支持Linux系统和Ubuntu系统。官方下载地址: http://redis.io/download 由于我们的开发项目以Windows为主,所以在此不对官方版本做详细介绍,有兴趣的可以到官网查看。 #### 非官方版本(Windows 版本)官方没有Redis的Windows版本,但是微软开源技术团队(Microsoft Open Tech group)自行开发和维护了一个Win64的版本。 - 微软团队只提供了官方64位版本,而32位版本,需要自己从源代码构建。 - Released版本中提供了msi文件,Redis可以作为Windows服务安装 安装服务 ?下载Win64的压缩文件到一个指定文件夹 ?打开一个 cmd 窗口使用cd命令切换目录到解压缩的文件夹下运行redis-server.exe redis.windows.conf ?redis-server.exe启动Redis服务 ?redis.windows.conf Redis服务的一些配置,不写则会调用默认设置 ?端口号默认6379可以通过修改配置文件redis.windows-service.conf修改或CONFIG set命令修改 运行客户端 ?打开一个 cmd 窗口使用cd命令切换目录到解压缩的文件夹运行redis-cli.exe -h 127.0.0.1 -p 6379 ?redis-cli.exe启动Redis客户端 ?-h 127.0.0.1服务器IP地址 ?-p 6379服务器端口号

分析Redis架构设计

redis启动流程 1.初始化server变量,设置redis相关的默认值 2.读入配置文件,同时接收命令行中传入的参数,替换服务器设置的默认值 3.初始化服务器功能模块。在这一步初始化了包括进程信号处理、客户端链表、共享对象、初始化数据、初始化网络连接等 4.从RDB或AOF重载数据 5.网络监听服务启动前的准备工作 6.开启事件监听,开始接受客户端的请求 启动的部分过程通过查看下图,会更直观。 下面是针对启动过程中,对各个模块的详细理解。(目前只分析了后台线程系统与慢查询

日志系统) 三、Redis数据持久化方案 在使用redis时不少人都说一个问题,就是说redis宕机了怎么办?会不会数据丢失等等的问题。 现在来看看Redis提供的数据持久化解决方案,并通过原理分析优缺点。最终能得出Redis适合使用的应用场景。 1.RDB持久化方案 在Redis运行时,RDB程序将当前内存中的数据库快照保存到磁盘中,当Redis需要重启时,RDB程序会通过重载RDB文件来还原数据库。 从上述描述可以看出,RDB主要包括两个功能: 关于rdb的实现可以见src/rdb.c a)保存(rdbSave) rdbSave负责将内存中的数据库数据以RDB格式保存到磁盘中,如果RDB文件已经存在将会替换已有的RDB文件。保存RDB文件期间会阻塞主进程,这段时间期间将不能处理新的客户端请求,直到保存完成为止。 为避免主进程阻塞,Redis提供了rdbSaveBackground函数。在新建的子进程中调用rdbSave,保存完成后会向主进程发送信号,同时主进程可以继续处理新的客户端请求。

云数据库Redis版

云数据库 Redis 版 用户指南

用户指南 使用购买 Redis 的账号登录 Redis 管理控制台。进入 Redis 实例列表界面,如下图所示。 管理实例 修改密码 如果您忘记密码、需要修改旧密码,或者在创建实例时没有设置密码,您可以重新设置实例的密码。 登录 Redis 管理控制台。 定位到目标实例,点击实例ID或者管理进入实例信息页面。 在修改密码窗口,输入旧密码和新密码,点击确认。 注意:如果您忘记密码,在修改密码窗口点击忘记旧密码的链接,可以在重置密码的窗口设置新密码。 云数据库 Redis 版支持按量付费模式,按量付费可以可执行变配操作。详细步骤请参考变配流程。 阿里云数据库支持经典网络和专有网络两种网络类型。本章介绍两种网络类型的区别及设置方法。 背景信息 在阿里云平台上,经典网络和专有网络的区别如下:

1.2.经典网络:经典网络中的云服务在网络上不进行隔离,只能依靠云服务自身的安全组或白名单策略来阻挡非法访问。 专有网络(Virtual Private Cloud,简称 VPC):专有网络帮助用户在阿里云上构建出一个隔离的网络环境。用户可以自定义专有网络里面的路由表、IP 地址范围和网关。此外用户可以通过专线或者VPN 的方式将自建机房与阿里云专有网络内的云资源组合成一个虚拟机房,实现应用平滑上云。 注意:经典网络可以转换为专有网络,专有网络不支持更换为经典网络。 Redis 默认使用经典网络,如果您要使用专有网络(VPC),Redis 和 VPC 必须在同一地域,有以下两种方式: 如果 Redis 还没有创建,您可以先建立 VPC,然后在 VPC 下创建 Redis,具体请参见下文 新建Redis场景。 如果 Redis 已经创建,您可以在 Redis 同一地域创建 VPC,然后将 Redis 加入 VPC,具体请参见下文 已有 Redis场景。 新建 Redis 场景 创建 VPC, 具体请参见 VPC 快速入门。创建与 VPC 所在地域一致的 Redis 实例。 在购买过程中,网络类型选择专有网络,选择对应的 VPC 即可。参见 创建实例 章节。 已有 Redis 场景 创建与 Redis实例所在地域一致的 VPC,具体请参见 VPC快速入门。 登录 Redis 管理控制台,选择目标实例,单击管理。 在实例信息页面,单击切换为专有网络。 在切换为专有网络页面中选择 VPC 和 虚拟交换机,单击确定,如下图所示。

Redis开发常用规范

Redis开发常用规范 1.冷热数据分离,不要将所有数据全部都放到Redis中 虽然Redis支持持久化,但是Redis的数据存储全部都是在内存中的,成本昂贵。建议根据业务只将高频热数据存储到Redis中【QPS大于5000】,对于低频冷数据可以使用 MySQL/ElasticSearch/MongoDB等基于磁盘的存储方式,不仅节省内存成本,而且数据量小在操作时速度更快、效率更高! 2.不同的业务数据要分开存储 不要将不相关的业务数据都放到一个Redis实例中,建议新业务申请新的单独实例。因为Redis为单线程处理,独立存储会减少不同业务相互操作的影响,提高请求响应速度;同时也避免单个实例内存数据量膨胀过大,在出现异常情况时可以更快恢复服务! 3.规范Key的格式 合适的key,便于查看,统计,排错。 “平台缩写“+“:”+“项目名”+“:”+“业务含义” 例如:GW:TRADE:USERID GW是新网关,TRADE是交易项目,USERID为业务ID。 ":"-作为key分隔符,方便客户端工具作为目录分级 4.存储的Key一定要设置超时时间 如果应用将Redis定位为缓存Cache使用,对于存放的Key一定要设置超时时间!因为若不设置,这些Key会一直占用内存不释放,造成极大的浪费,而且随着时间的推移会导致内存占用越来越大,直到达到服务器内存上限!另外Key的超时长短要根据业务综合评估,而不是越长越好!(某些业务要求key长期有效。可以在每次写入时,都设置超时时间,让超时时间顺延。) public Boolean set(final byte[] key, final byte[] value, final long liveTime) { return redisTemplate.execute(new RedisCallback() {

Redis中5种数据结构的使用场景介绍

一、redis 数据结构使用场景 原来看过redisbook 这本书,对redis 的基本功能都已经熟悉了,从上周开始看redis 的源码。目前目标是吃透redis 的数据结构。我们都知道,在redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String——字符串 Hash——字典 List——列表 Set——集合 Sorted Set——有序集合 下面我们就来简单说明一下它们各自的使用场景: 1. String——字符串 String 数据结构是简单的key-value 类型,value 不仅可以是String,也可以是数字(当数字类型用Long 可以表示的时候encoding 就是整型,其他都存储在sdshdr 当做字符串)。使用Strings 类型,可以完全实现目前Memcached 的功能,并且效率更高。还可以享受Redis 的定时持久化(可以选择RDB 模式或者AOF 模式),操作日志及Replication 等功能。除了提供与Memcached 一样的get、set、incr、decr 等操作外,Redis 还提供了下面一些操作: 代码如下: 1.LEN niushuai:O(1)获取字符串长度 2.APPEND niushuai redis:往字符串append 内容,而且采用智能分配内存(每次2倍) 3.设置和获取字符串的某一段内容 4.设置及获取字符串的某一位(bit) 5.批量设置一系列字符串的内容 6.原子计数器 7.GETSET 命令的妙用,请于清空旧值的同时设置一个新值,配合原子计数器使用 2. Hash——字典 在Memcached 中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般是JSON 格式),比如用户的昵称、年龄、性别、积分等。这时候在需要修改其中某一项时,通常需要将字符串(JSON)取出来,然后进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。简单修改一个属性就干这么多事情,消耗必定是很大的,也不适用于一些可能并发操作的场合(比如两个并发的操作都需要修改积分)。而Redis 的Hash 结构可以使你像在数据库中Update 一个属性一样只修改某一项属性值。 代码如下: 存储、读取、修改用户属性 3. List——列表 List 说白了就是链表(redis 使用双端链表实现的List),相信学过数据结构知识的人都应该能理解其结构。使用List 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的TimeLine )。List 的另一个应用就是消息队列,可以利用List 的*PUSH 操作,将任务存在List 中,然后工作线程再用POP 操作将任务取出进行执行。Redis 还提供了操作List 中某一段元素的API,你可以直接查询,删除List 中某一段的元素。 代码如下:

redis架构分析

一、前言 因为近期项目中开始使用Redis,为了更好的理解Redis并应用在适合的业务场景,需要对Redis设计与实现深入的理解。 我分析流程是按照从main进入,逐步深入分析Redis的启动流程。同时根据Redis初始化的流程,理解Redis各个模块的功能及原理。 二、redis启动流程 1.初始化server变量,设置redis相关的默认值 2.读入配置文件,同时接收命令行中传入的参数,替换服务器设置的默认值 3.初始化服务器功能模块。在这一步初始化了包括进程信号处理、客户端链表、共享对象、初始化数据、初始化网络连接等 4.从RDB或AOF重载数据 5.网络监听服务启动前的准备工作 6.开启事件监听,开始接受客户端的请求 启动的部分过程通过查看下图,会更直观。

下面是针对启动过程中,对各个模块的详细理解。(目前只分析了后台线程系统与慢查询日志系统)

三、Redis数据持久化方案 在使用redis时不少人都说一个问题,就是说redis宕机了怎么办?会不会数据丢失等等的 问题。 现在来看看Redis提供的数据持久化解决方案,并通过原理分析优缺点。最终能得出Redis 适合使用的应用场景。 1.RDB持久化方案 在Redis运行时,RDB程序将当前内存中的数据库快照保存到磁盘中,当Redis需要重启时,RDB程序会通过重载RDB文件来还原数据库。 从上述描述可以看出,RDB主要包括两个功能: 关于rdb的实现可以见src/rdb.c a)保存(rdbSave) rdbSave负责将内存中的数据库数据以RDB格式保存到磁盘中,如果RDB文件已经存在将会替换已有的RDB文件。保存RDB文件期间会阻塞主进程,这段时间期间将不能处理新的客户端请求,直到保存完成为止。 为避免主进程阻塞,Redis提供了rdbSaveBackground函数。在新建的子进程中调用rdbSave,保存完成后会向主进程发送信号,同时主进程可以继续处理新的客户端请求。 b)读取(rdbLoad) 当Redis启动时,会根据配置的持久化模式,决定是否读取RDB文件,并将其中的对象保存到内存中。 载入RDB过程中,每载入1000个键就处理一次已经等待处理的客户端请求,但是目前仅 处理订阅功能的命令(PUBLISH 、SUBSCRIBE 、PSUBSCRIBE 、UNSUBSCRIBE 、PUNSUBSCRIBE),其他一律返回错误信息。因为发布订阅功能是不写入数据库的,也就是不保存在Redis数据库的。 RDB的缺点: 再说RDB缺点时,需要提到的是RDB有保存点的概念。在默认的redis.conf中可以看到这样的默认配置: [plain]view plaincopy 1.#save [plain]view plaincopy 1.save 900 1 #如果15分钟内,有1个键被修改 [plain]view plaincopy 1.save 300 10 #如果6分钟内,有10个键被修改 [plain]view plaincopy

redis key-value设计

1.我在项目中使用redis不会缓存对象,而是存储jso(Google Protocol Buffer)字符串。 因为频繁的序列化和反序列化会占用cpu,所以我们这样使用可以降低redis服务对CPU的要求。一般部署redis的主机都是内存比较空闲的主机,而把解析json这部分工作移到应用内部,应用所在主机的CPU配置必然是高的。这样可以有效的利用主机资源。 2.KEY的设计就是字符串拼接的形式: 比如[user]::[id]::[act]。 3. redis缓存服务器笔记 redis是一个高性能的key-value存储系统,能够作为缓存框架和队列 但是由于他是一个内存内存系统,这些数据还是要存储到数据库中的 4.作为缓存框架: create/updae/delete---同时存到redis和数据库 query--先从redis查,没有记录才从数据库查,并把从数据库查的结果也放一份到redis 5.作为缓存队列: 把对象Object存储到redis中,怎么存?memcache存取对象是序列化和反序列化使用通用的序列化、反序列化(频繁的会很消耗cpu,使用Google Protocol Buffer,将对象打成二进制流)或者使用json存储(阿里巴巴的fast-json) 6.java使用redis的客户端一般是:jedis jedis的原生接口只支持基本数据类型和String、byte[] 7.我对redis队列的理解: 重要的数据:先存到数据库,然后存到redis 要求响应速度很高的的数据:先写缓存,然后通过消息队列再写入数据库 因为Redis的value支持String、list、set、zset 那么就可以把redis的list当作队列来用 入队:lpush mylist 'hello1' 出队:lpop mylist 8.其提供AOF(追加式操作记录文件)和DUMP(定期数据备份)两种持久化方式9.VM(虚拟内存机制):如果有1万条数据保存到内存中,那么我就要配置能存储这么多数据的内存然后这1万条数据有9000条不是活跃数据,那就白白浪费了,可以这样做,当数据容量超过内存时,将部分value存储到文件中memcached是把数据完全存储

Redis数据库的使用场景介绍(避免误用Redis)

Redis 是目前NoSQL 领域的当红炸子鸡,它象一把瑞士军刀,小巧、锋利、实用,特别适合解决一些使用传统关系数据库难以解决的问题。但是Redis 不是银弹,有很多适合它解决的问题,但是也有很多并不适合它解决的问题。另外,Redis 作为内存数据库,如果用在不适合的场合,对内存的消耗是很可观的,甚至会让系统难以承受。 我们可以对系统存储使用的数据以两种角度分类,一种是按数据的大小划分,分成大数据和小数据,另一种是按数据的冷热程度划分,分成冷数据和热数据,热数据是指读或写比较频繁的数据,反之则是冷数据。 可以举一些具体的例子来说明数据的大小和冷热属性。比如网站总的注册用户数,这明显是一个小而热的数据,小是因为这个数据只有一个值,热是因为注册用户数随时间变化很频繁。再比如,用户最新访问时间数据,这是一个量比较大,冷热不均的数据,大是数据的粒度是用户级别,每一个用户都有数据,如果有一千万用户,就意味着有一千万的数据,冷热不均是因为活跃用户的最新访问时间变化很频繁,但是可能有很大一部非活跃用户访问时间长时间不会发生变化。 大体而言,Redis 最适合处理的是小而热,而且是写频繁,或者读写都比较频繁的热数据。对于大而热的数据,如果其它方式很难解决问题,也可以考虑使用Redis 解决,但是一定要非常谨慎,防止数据无限膨胀。原因如下: 首先,对于冷数据,无论大小,都不建议放在Redis 中。Redis 数据要全部放在内存中,资源宝贵,把冷数据放在其中实在是一种浪费,冷数据放在普通的存储比如关系数据库中就好了。 其次,对于热数据,尤其是写频繁的热数据,如果量比较小,是最适合放到Redis 中的。比如上面提到的网站总的注册用户数,就是典型的Redis 用做计数器的例子。再比如论坛最新发表列表,最新报名列表,可以控制数量在几百到一千的规模,也是典型的redis 做最新列表的使用方式。 另外,对于量比较大的热数据(或者冷热不均数据),使用Redis 时一定要比较谨慎。这种类型数据很容易引起数据膨胀,导致Redis 消耗内存巨大,让系统难以承受。薄荷的一个惨痛教训是把用户关注(以及被关注)数据放在Redis 中,这是一种数据量极大,冷热很不均衡的数据,在几百万的用户级别就占用了近10 GB左右内存,让Redis 变得难以应付。应对这种类型的数据,可以用普通存储+ 缓存的方式。 如果用对了地方,比如在小而热的数据情形,Redis 表现很棒,如果用错了地方,Redis 也会带来昂贵的代价,所以使用时务必谨慎。 更多信息请查看IT技术专栏

分布式缓存Redis使用方法

分布式缓存Redis使用方法 作者:张小博,新炬网络技术专家。 缓存在系统中的作用: 1、少量数据存储,高速读写访问。通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。 2、海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。Redis3.0以后开始支持集群,实现了半自动化的数据分片,不过需要smart-client的支持。 Redis全角度介绍: 网络模型:Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。 内存管理:Redis使用现场申请内存的方式来存储数据,并且很少使用free-list 等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。 数据一致性问题:在一致性问题上,个人感觉redis没有memcached实现的好,Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串命令的原子性,中间不会被任何操作打断。 支持的KEY类型:Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举出所有数据,Redis还同时提供

Redis 笔记整理

Redis资料整理 第一节Redis介绍 1.1 什么是Redis Redis 是完全开源免费的,遵守BSD协议,是一个存储在内存中高性能的key-value数据库。Redis 与其他key - value 缓存产品有以下三个特点: 1、Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 2、Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 3、Redis支持数据的备份,即master-slave模式的数据备份。 、 1.2 Redis的优势 1、性能极高– Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型– Redis支持二进制案例的Strings, Lists, Hashes, Sets 及Ordered Sets 数据类型操作。 2、原子–Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。丰富的特性– Redis还支持publish/subscribe, 通知, key 过期等等特性。

1.3 Redis key-value存储有什么不同? 1、Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。 2、Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

Redis数据库的安装配置方法

redis 是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定,而且没有在实际的一些大型系统应用的实例。此外,缺乏mc中批量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。 性能测试结果: SET操作每秒钟110000 次,GET操作每秒钟81000 次,服务器配置如下: Linux 2.6, Xeon X3320 2.5Ghz. stackoverflow 网站使用Redis 做为缓存服务器。 安装过程: Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。 Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。 一、下载最新版 wget 二、解压缩 tar redis-2.0.0-rc4.tar.gz 三、安装C/C++的编译组件(非必须) apt-get install build-essential 四、编译 cd redis-2.0.0-rc4 make make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下: redis-server:Redis服务器的daemon启动程序 redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况 在后面会有这几个命令的说明,当然是从网上抄的。。。 五、修改配置文件 /etc/sysctl.conf 添加 vm.overcommit_memory=1 刷新配置使之生效 sysctl vm.overcommit_memory=1 补充介绍: **如果内存情况比较紧张的话,需要设定内核参数: echo 1 > /proc/sys/vm/overcommit_memory

相关主题
文本预览
相关文档 最新文档