①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的疑问等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)