谈谈redis,memcache的区别和具体应用场景

谈谈redis,memcache的区别和具体应用场景,第1张

①Redis定义:

Redis是由意大利人SalvatoreSanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:RemoteDictionaryServer(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sortedset)、hash。

②Redis特点

Redis以内存作为数据存储介质,所以读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。

Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启后,数据也不会丢失。因为Redis的存储分为内存存储、磁盘存储和log文件三部分,重启后,Redis可以从磁盘重新将数据加载到内存中,这些可以通过配置文件对其进行配置,正因为这样,Redis才能实现持久化。

Redis支持主从模式,可以配置集群,这样更利于支撑起大型的项目,这也是Redis的一大亮点。

③Redis应用场景,它能做什么

众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。

拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。

总之,Redis的应用是非常广泛的,而且极有价值,真是服务器中的一件利器,所以从现在开始,我们就来一步步学好它。

预备

jedis-252

commons-pool2-22jar

使用单连接

此方式仅建议用于开发环境做调试用。

// 创建连接

String host = "19216856102";

int port = 6379;

Jedis client = new Jedis(host, port);

// 执行set指令

String result = clientset("key-string", "Hello, Redis!");

Systemoutprintln( Stringformat("set指令执行结果:%s", result) );

// 执行get指令

String value = clientget("key-string");

Systemoutprintln( Stringformat("get指令执行结果:%s", value) );

运行上述代码,控制台输出:

set指令执行结果:OK

get指令执行结果:Hello, Redis!

使用连接池

此方式适用于仅使用单个Redis实例的场景。

// 生成连接池配置信息

JedisPoolConfig config = new JedisPoolConfig();

configsetMaxIdle(10);

configsetMaxTotal(30);

configsetMaxWaitMillis(31000);

// 在应用初始化的时候生成连接池

JedisPool pool = new JedisPool(config, "19216856102", 6379);

// 在业务 *** 作时,从连接池获取连接

Jedis client = poolgetResource();

try {

// 执行指令

String result = clientset("key-string", "Hello, Redis!");

Systemoutprintln( Stringformat("set指令执行结果:%s", result) );

String value = clientget("key-string");

Systemoutprintln( Stringformat("get指令执行结果:%s", value) );

} catch (Exception e) {

// TODO: handle exception

} finally {

// 业务 *** 作完成,将连接返回给连接池

if (null != client) {

poolreturnResource(client);

}

} // end of try block

// 应用关闭时,释放连接池资源

pooldestroy();

运行上述代码,控制台输出:

set指令执行结果:OK

get指令执行结果:Hello, Redis!

使用连接池+分布式

在规模较大的系统中,往往会有多个Redis实例做负载均衡。并且还实现主从备份,当主实例发生故障时,切换至从实例提供服务。

类似于Memcached的客户端,Jedis也提供了客户端分布式 *** 作的方式,采用一致性哈希算法。

// 生成多机连接信息列表

List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();

shardsadd( new JedisShardInfo("127001", 6379) );

shardsadd( new JedisShardInfo("19216856102", 6379) );

// 生成连接池配置信息

JedisPoolConfig config = new JedisPoolConfig();

configsetMaxIdle(10);

configsetMaxTotal(30);

configsetMaxWaitMillis(31000);

// 在应用初始化的时候生成连接池

ShardedJedisPool pool = new ShardedJedisPool(config, shards);

// 在业务 *** 作时,从连接池获取连接

ShardedJedis client = poolgetResource();

try {

// 执行指令

String result = clientset("key-string", "Hello, Redis!");

Systemoutprintln( Stringformat("set指令执行结果:%s", result) );

String value = clientget("key-string");

Systemoutprintln( Stringformat("get指令执行结果:%s", value) );

} catch (Exception e) {

// TODO: handle exception

} finally {

// 业务 *** 作完成,将连接返回给连接池

if (null != client) {

poolreturnResource(client);

}

} // end of try block

// 应用关闭时,释放连接池资源

pooldestroy();

运行上述代码,控制台输出:

set指令执行结果:OK

get指令执行结果:Hello, Redis!

ava *** 作redis的jedis的范围查询是怎么写的? 我要从一个范围到另一个范围的区间

我试过了,

List userList = jedislrange("userList", 0, -1);

Set user = jediszrange("user", 0, -1);

这两个范围查询的得到结果,为何都是 0

但是我用 Set str =jediskeys("tes2:");

发现是用完整的数据的,我一次性读取这么多数据,redis直接socket失败了

它是专为 NET 平台设计的一种静态类型编程语言。 Nemerle 中的程序会被编译成中间语言字节码。它支持函数式,命令式以及面向对象编程。

-r(repeat)选项代表将命令执行多次,例如下面 *** 作将会执行三次ping

命令:

redis-cli -r 3 ping 

PONG

PONG 

PONG

-i(interval)选项代表每隔几秒执行一次命令,但是-i选项必须和-r选 项一起使用,下面的 *** 作会每隔1秒执行一次ping命令,一共执行5次:

注意-i的单位是秒,不支持毫秒为单位,但是如果想以每隔10毫秒执行 一次,可以用-i001

redis-cli -r 5 -i 001 ping

例如下面的 *** 作利用-r和-i选项,每隔1秒输出内存的使用量,一共输出 100次

redis-cli -r 100 -i 1 info | grep used_memory_human 

used_memory_human:295G 

used_memory_human:295G

-x选项代表从标准输入(stdin)读取数据作为redis-cli的最后一个参 数,例如下面的 *** 作会将字符串world作为set hello的值

$ echo "world" | redis-cli -x set hello 

OK

-c(cluster)选项是连接Redis Cluster节点时需要使用的,-c选项可以防 止moved和ask异常

如果Redis配置了密码,可以用-a(auth)选项,有了这个选项就不需要 手动输入auth命令

--scan选项和--pattern选项用于扫描指定模式的键,相当于使用scan命令

--slave选项是把当前客户端模拟成当前Redis节点的从节点,可以用来 获取当前Redis节点的更新 *** 作

下面开启第一个客户端,使用--slave选项,看到同步已完成:

$ redis-cli --slave 

SYNC with master, discarding 72 bytes of bulk transfer 

SYNC done Logging commands from master

--rdb选项会请求Redis实例生成并发送RDB持久化文件,保存在本地。 可使用它做持久化文件的定期备份

--pipe选项用于将命令封装成Redis通信协议定义的数据格式,批量发送 给Redis执行

例如下面 *** 作 同时执行了set hello world和incr counter两条命令:

echo -en '3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n2\r\n$4\r\nincr\r\ n$7\r\ncounter\r\n' | redis-cli --pipe

--bigkeys选项使用scan命令对Redis的键进行采样,从中找到内存占用比

较大的键值,这些键可能是系统的瓶颈

--eval选项用于执行指定Lua脚本,有关Lua脚本的使用将在34节介绍。

latency有三个选项,分别是--latency、--latency-history、--latency-dist。 它们都可以检测网络延迟,对于Redis的开发和运维非常有帮助。

该选项可以测试客户端到目标Redis的网络延迟,例如当前拓扑结构如 图3-4所示。客户端B和Redis在机房B,客户端A在机房A,机房A和机房B是

跨地区的

客户端B:

redis-cli -h {machineB} --latency 

min: 0, max: 1, avg: 007 (4211 samples)

客户端A:

redis-cli -h {machineB} --latency 

min: 0, max: 2, avg: 104 (2096 samples)

可以看到客户端A由于距离Redis比较远,平均网络延迟会稍微高一些

--latency的执行结果只有一条,如果想以分时段的形式了解延迟信息, 可以使用--latency-history选项:

redis-cli -h 1010xxxx --latency-history 

min: 0, max: 1, avg: 028 (1330 samples) -- 1501 seconds range… 

min: 0, max: 1, avg: 005 (1364 samples) -- 1501 seconds range

可以看到延时信息每15秒输出一次,可以通过-i参数控制间隔时间。

(3)--latency-dist

该选项会使用统计图表的形式从控制台输出延迟统计信息。

--stat选项可以实时获取Redis的重要统计信息,虽然info命令中的统计信 息更全,但是能实时看到一些增量的数据(例如requests)对于Redis的运维还是有一定帮助的

--no-raw选项是要求命令的返回结果必须是原始的格式,--raw恰恰相反,返回格式化后的结果。

在Redis中设置一个中文的value:

$redis-cli set hello "你好" 

OK

如果正常执行get或者使用--no-raw选项,那么返回的结果是二进制格式:

如果使用了--raw选项,将会返回中文:

$redis-cli --raw get hello

你好

redis 127001:6379> config get max--entries

1) "hash-max-zipmap-entries"

2) "512"

3) "list-max-ziplist-entries"

4) "512"

5) "set-max-intset-entries"

6) "512"

互联网需求的3高: 高并发,高可扩,高性能。

Redis 是一种运行速度很快,并发性能很强,并且运行在内存上的NoSql(not only sql)数据库

NoSQL数据库 和 传统数据库 相比的优势:

NoSQL数据库无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。

而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段 简直就是一个噩梦。

Redis的常用使用场景:

缓存 ,毫无疑问这是Redis当今最为人熟知的使用场景。在提升服务器性能方面非常有效;一 些频繁被访问的数据,经常被访问的数据如果放在关系型数据库,每次查询的开销都会很 大,而放在redis中,因为redis 是放在内存中的可以很高效的访问

排行榜 ,在使用传统的关系型数据库(mysql oracle 等)来做这个事儿,非常的麻烦,而利 用Redis的SortSet(有序集合)数据结构能够简单的搞定;

好友关系 ,利用集合的一些命令,比如求交集、并集、差集等。可以方便搞定一些共同好 友、共同爱好之类的功能;

Session共享 ,以jsp为例,默认Session是保存在服务器的文件中,如果是集群服务,同一个 用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论 用户落在那台机器上都能够获取到对应的Session信息。

下载: redis:>

以上就是关于谈谈redis,memcache的区别和具体应用场景全部的内容,包括:谈谈redis,memcache的区别和具体应用场景、如何用java获取redis的info、关于java redis的 *** 作jedis的疑问等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9819755.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存