Redis介绍
Redis 介绍
Redis是REmote DIctionary Server(远程字典服务器)的缩写,它以字典结构(key-value键值对结构)存储数据,并允许其他应用通过TCP协议读写字典中的内容。所以,redis是一个key-value存储系统,或者说是一个key-value数据库。
Redis是用C语言开发的,并提供了几十种不同编程语言的客户端库,即我们用java语言也可以操作redis。
这种字典形式的存储结构与常见的MySQL 等关系数据库的二维表形式的存储结构有很大的差异。
关系型数据库存储的数据都是结构化数据
Redis字典结构(k-v)的存储方式使得开发者可以将程序中的数据直接映射到Redis中,数据在Redis中的存储形式和其在程序中的存储方式非常相近。
使用Redis的另一个优势是其对不同的数据类型提供了非常方便的操作方式,如使用集合类型存储文章标签,Redis可以对标签进行如交集、并集这样的集合运算操作。
Redis存储数据的介质是内存,所以可以提供高效的读取。
所以,redis数据库,我们也称之为非关系型数据库(Nosql)。而mysql,oracle等数据库称之为关系型数据库。这两种类型的数据库,没有优劣之分,看具体的应用场景。
Redis的内存存储和持久化
Redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势,在一台普通的笔记本电脑上,Redis可以在一秒内读写超过十万个键值。
将数据存储在内存中也有问题,例如,程序退出后内存中的数据会丢失。不过 Redis提供了对持久化的支持,即将可以内存中的数据异步写入到硬盘中,同时不影响继续提供服务。
Redis 技术起源
2008年,意大利的一家创业公司Merzia 推出了一款基于MySQL的网站实时统计系统LLOOGG ,然而没过多久该公司的创始人Salvatore Sanfilippo便开始对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。
不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望让更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查 ,结果显示有近12%的公司在使用Redis。国内如新浪微博、知乎,国外如GitHub、Stack Overflow、Flickr、暴雪和Instagram,都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发,Salvatore Sanfilippo和Pieter Noordhuis也分别于同年的3月和5月加入VMware,全职开发Redis。
Redis 网址
官网:http://redis.io/
指令学习地址:https://redis.io/commands (Redis 有100多个指令,但常用的就10多个)
Redis 安装
Redis基础指令
Redis数据类型及指令
Redis-单机的多服务实例启动
Jedis API
实现步骤:
1.下载Jedis依赖jar包
2.在maven工程里,建立测试类
3.调用Jedis的API
代码:
@Test
public void testConnect(){
Jedis jedis=new Jedis("192.168.234.206",6379);
jedis.set("test01","helloredis");
jedis.close();
}
@Test
public void testGeneralAPI(){
Jedis jedis=new Jedis("192.168.234.206",6379);
Set<String> set=jedis.keys("*");
for(String key:set){
System.out.println(key);
}
jedis.del("name");
jedis.get("name");
jedis.append("name","123214");
jedis.incr("name");
jedis.incrBy("name", 2);
//只要把redis的指令掌握好,API不用学。因为方法名和指令名及指令作用都是一样的
jedis.close();
}
Shard数据分片
利用Jedis实现Shard分片
代码:
/*
* jedis shard数据分片,利用池化的思想,管理多个redis服务实例,并对k-v数据进行存储和管理
* 程序员只需要通过API进行key-value做CRUD即可。
* shard数据分片用的是哈希一致性算法,一致性哈希算法有个一特性——平衡性,指的是让最后的哈希结果尽可能均匀分布到各个桶里。
* 这弥补了简单hash算法可能带来的数据倾斜问题。
*/
@Test
public void testShard(){
JedisPoolConfig config=new JedisPoolConfig();
List<JedisShardInfo> serverList=new ArrayList<>();
serverList.add(new JedisShardInfo("192.168.234.206",6379));
serverList.add(new JedisShardInfo("192.168.234.206",6380));
ShardedJedisPool pool=new ShardedJedisPool(config, serverList);
ShardedJedis jedis=pool.getResource();
for(int i=0;i<1000;i++){
jedis.set(i+"",i+"");
}
//用完后将jedis 连接还到池子
pool.returnResource(jedis);
}