您的位置:首页 > 数据库 > Redis

redis

2016-04-05 16:11 471 查看
Redis 是一种非关系数据库,能够拥有一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。优点是:
1.Redis数据库完全在内存中,使用磁盘仅用于持久性
2.相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
3.Redis可以将数据复制到任意数量的从服务器。

Redis 优势:
异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。

支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。

操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。

多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

按照客服端,和服务端。按照后先打开服务端,然后在打开客服端。
Redis常见命令:http://redisdoc.com/key/move.html
select 0 表示选择数据库
keys * 查看数据库中所有的key
设置key 和值 set key value
判断一个key是否存在 exists key
获取key的值 get key 还有很多设置过期时间,覆盖值等,和其他数据类型的用户就不一一列举了。用的时候看吧。反正我是连续用了好几天,有些都没记住。
redis 主要有String set list sortset hashs geo数据类型。可以根据不同用到的情况,用不同的数据类型。

redis 结合java的使用:
package First.com.downjoy.first;

import java.awt.font.ShapeGraphicAttribute;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.GeoUnit;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.jedis.SortingParams;

public class RedisTest {


/**
* 非切片
*/
private Jedis jedisl;//非切片额客户端连接
private JedisPool jPool;
/**
* 切片
*/
private ShardedJedis shardedJedis;//切片额客户端连接

private ShardedJedisPool shardedJedisPool;
public RedisTest() {
initJedis();
initShareedpool();
jedisl = jPool.getResource();
shardedJedis = shardedJedisPool.getResource();
}
/**
*
* 初始化非切片池
*/
private void initJedis(){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(20);//设置最大空闲链接数
jedisPoolConfig.setMaxTotal(1000);
jedisPoolConfig.setTestOnBorrow(false);
jPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379,0);
}

/**
* 切片池
*/
public void initShareedpool(){
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(10);
//设置最大等待时间
config.setMaxWaitMillis(1000);
config.setTestOnBorrow(false);
// slave链接


List<JedisShardInfo> share = new ArrayList<JedisShardInfo>();
share.add(new JedisShardInfo("127.0.0.1",6379,0));

// 构造池
shardedJedisPool = new ShardedJedisPool(config, share);
}
public void show(){
//KeyOperate();
// SortedSetOperate();
//StringOperate();
//ListOperate();
//setOperate();
//HashOperate();
GeoOperate();



}
/** 对存储结构为List类型的操作 */
private void ListOperate() {

//System.out.println(("清空库中所有数据:"+jedisl.flushDB()));

/**
* 向list列表添加一些数据
*/
shardedJedis.lpush("namelist", "ac");
shardedJedis.lpush("namelist", "cc");
shardedJedis.lpush("namelist", "cc");
shardedJedis.lpush("namelist", "dc");
shardedJedis.lpush("namelist", "ec");
shardedJedis.lpush("namelist", "fc");
System.out.println("打印所有的namelist里的数据:"+shardedJedis.lrange("namelist", 0, -1));
System.out.println("删除指定范围的值,只保留第一个和最后一个的值:"+shardedJedis.ltrim("namelist", 0, -2));
System.out.println("删除指定的值 1表示个数(有重复的时候)"+shardedJedis.lrem("namelist", 1l, "cc"));
System.out.println("出栈元素:"+shardedJedis.lpop("namelist"));
System.out.println("打印所有的namelist里的数据:"+shardedJedis.lrange("namelist", 0, -1));

System.out.println("修改列表元素指定的值:"+shardedJedis.lset("namelist", 0, "ddd修改的值"));

System.out.println("列表的长度:"+shardedJedis.llen("namelist"));
SortingParams sortingParams = new SortingParams();
//按照字母顺序排序
sortingParams.alpha();
sortingParams.limit(0, shardedJedis.llen("namelist").SIZE);
System.out.println("返回排序后的结果:"+shardedJedis.sort("namelist", sortingParams));
System.out.println("获取下标为1的元素:"+shardedJedis.lindex("namelist", 1l));

}
private void StringOperate() {
System.out.println("======================String_1==========================");
// 清空数据
System.out.println("清空库中所有数据:"+jedisl.flushDB());

System.out.println("=============增=============");
jedisl.set("key001","value001");
jedisl.set("key002","value002");
jedisl.set("key003","value003");
System.out.println(" 4000 已新增的3个键值对如下:");
System.out.println(jedisl.get("key001"));
System.out.println(jedisl.get("key002"));
System.out.println(jedisl.get("key003"));

System.out.println("=============删=============");
System.out.println("删除key003键值对:"+jedisl.del("key003"));
System.out.println("获取key003键对应的值:"+jedisl.get("key003"));

System.out.println("=============改=============");
//1、直接覆盖原来的数据
System.out.println("直接覆盖key001原来的数据:"+jedisl.set("key001","value001-update"));
System.out.println("获取key001对应的新值:"+jedisl.get("key001"));
//2、直接覆盖原来的数据
System.out.println("在key002原来值后面追加:"+jedisl.append("key002","+appendString"));
System.out.println("获取key002对应的新值"+jedisl.get("key002"));

System.out.println("=============增,删,查(多个)=============");
/**
* mset,mget同时新增,修改,查询多个键值对
* 等价于:
* jedis.set("name","ssss");
* jedis.set("jarorwar","xxxx");
*/
System.out.println("一次性新增key201,key202,key203,key204及其对应值:"+jedisl.mset("key201","value201",
"key202","value202","key203","value203","key204","value204"));
jedisl.mset("a", "a1","a2","k2");
List<String> mlist = jedisl.mget("key201","key202");
for (String string : mlist) {
System.out.println("value的值:"+string);
}
System.out.println("一次性获取key201,key202,key203,key204各自对应的值:"+
jedisl.mget("key201","key202","key203","key204"));
System.out.println("一次性删除key201,key202:"+jedisl.del(new String[]{"key201", "key202"}));
System.out.println("一次性获取key201,key202,key203,key204各自对应的值:"+
jedisl.mget("key201","key202","key203","key204"));
System.out.println();
//jedis具备的功能shardedJedis中也可直接使用,下面测试一些前面没用过的方法
System.out.println("======================String_2==========================");
// 清空数据
System.out.println("清空库中所有数据:"+jedisl.flushDB());
System.out.println("=============新增键值对时防止覆盖原先值=============");
System.out.println("原先key301不存在时,新增key301:"+shardedJedis.setnx("key301", "value301"));
System.out.println("原先key302不存在时,新增key302:"+shardedJedis.setnx("key302", "value302"));
System.out.println("当key302存在时,尝试新增key302:"+shardedJedis.setnx("key302", "value302_new"));
System.out.println("获取key301对应的值:"+shardedJedis.get("key301"));
System.out.println("获取key302对应的值:"+shardedJedis.get("key302"));
System.out.println("=============超过有效期键值对被删除=============");
// 设置key的有效期,并存储数据
System.out.println("新增key303,并指定过期时间为2秒"+shardedJedis.setex("key303", 2, "key303-2second"));
System.out.println("获取key303对应的值:"+shardedJedis.get("key303"));
try{
Thread.sleep(3000);
}
catch (InterruptedException e){
}
System.out.println("3秒之后,获取key303对应的值:"+shardedJedis.get("key303"));
System.out.println("=============获取原值,更新为新值一步完成=============");
System.out.println("key302原值:"+shardedJedis.getSet("key302", "value302-after-getset"));
System.out.println("key302新值:"+shardedJedis.get("key302"));
System.out.println("=============获取子串=============");
System.out.println("获取key302对应值中的子串:"+shardedJedis.getrange("key302", 5, 7));
}
private void KeyOperate() {
System.out.println("======================key==========================");
// 清空数据
System.out.println("清空库中所有数据:"+jedisl.flushDB());
// 判断key否存在
System.out.println("判断key999键是否存在:"+shardedJedis.exists("key999"));
System.out.println("新增key001,value001键值对:"+shardedJedis.set("key001", "value001"));
System.out.println("判断key001是否存在:"+shardedJedis.exists("key001"));
// 输出系统中所有的key
System.out.println("新增key002,value002键值对:"+shardedJedis.set("key002", "value002"));
System.out.println("系统中所有键如下:");
Set<String> keys = jedisl.keys("*");
Iterator<String> it=keys.iterator() ;
while(it.hasNext()){
String key = it.next();
System.out.println(key);
}
// 删除某个key,若key不存在,则忽略该命令。
System.out.println("系统中删除key002: "+jedisl.del("key002"));
System.out.println("判断key002是否存在:"+shardedJedis.exists("key002"));
// 设置 key001的过期时间
System.out.println("设置 key001的过期时间为5秒:"+jedisl.expire("key001", 5));
try{
Thread.sleep(2000);
}
catch (InterruptedException e){
}
// 查看某个key的剩余生存时间,单位【秒】.永久生存或者不存在的都返回-1
System.out.println("查看key001的剩余生存时间:"+jedisl.ttl("key001"));
// 移除某个key的生存时间
System.out.println("移除key001的生存时间:"+jedisl.persist("key001"));
System.out.println("查看key001的剩余生存时间:"+jedisl.ttl("key001"));
// 查看key所储存的值的类型
System.out.println("查看key所储存的值的类型:"+jedisl.type("key001"));
/*
* 一些其他方法:1、修改键名:jedis.rename("key6", "key0");
* 2、将当前db的key移动到给定的db当中:jedis.move("foo", 1)
*/
}
/**
* redis 对set的基本操作
*/
public void setOperate(){

/**向nameSET添加数据,如果不存在课题key 这创建key
* 如果存在这了添加失败返回0
*/
shardedJedis.sadd("nameset", "1","2","4","a","c");
/**
* 向sets 中加入一些数据
*/
jedisl.sadd("sets", "1","2","3","a","c");
System.out.println("获取sets中的所有元素:"+jedisl.smembers("sets"));


System.out.println("删除集合中制定的元素:"+jedisl.srem("sets", "1"));

System.out.println("判断1是否在集合sets中:"+jedisl.sismember("sets", "1"));
System.out.println("判断2是否在集合sets中:"+jedisl.sismember("sets", "2"));

Set<String> redisSet = jedisl.smembers("sets");


for (String string : redisSet) {
System.out.println("获取集合中的每一元素:"+string);
}

//向集合sets1中加入数据
jedisl.sadd("sets1", "1","2","3","5","a","c");

System.out.println("求sets1和sets中集合的交集:"+jedisl.sinter("sets","sets1"));
System.out.println("求sets1和sets中集合的并集:"+jedisl.sunion("sets","sets1"));
System.out.println("求sets1和sets中集合的差集:"+jedisl.sdiff("sets1","sets"));
System.out.println("nameset 是否有值 不存在返回0 存在返回基数:"+shardedJedis.scard("nameset"));
System.out.println(shardedJedis.echo("nameset"));
}
private void SortedSetOperate()
{
System.out.println("======================zset==========================");
// 清空数据
// System.out.println(jedis.flushDB());

System.out.println("=============增=============");
System.out.println("zset中添加元素element001:"+shardedJedis.zadd("zset", 7.0, "element001"));
System.out.println("zset中添加元素element002:"+shardedJedis.zadd("zset", 8.0, "element002"));
System.out.println("zset中添加元素element003:"+shardedJedis.zadd("zset", 2.0, "element003"));
System.out.println("zset中添加元素element004:"+shardedJedis.zadd("zset", 3.0, "element004"));
System.out.println("zset集合中的所有元素:"+shardedJedis.zrange("zset", 0, -1));//按照权重值排序
System.out.println();

System.out.println("=============删=============");
System.out.println("zset中删除元素element002:"+shardedJedis.zrem("zset", "element002"));
System.out.println("zset集合中的所有元素:"+shardedJedis.zrange("zset", 0, -1));
System.out.println();

System.out.println("=============改=============");
System.out.println();

System.out.println("=============查=============");
System.out.println("统计zset集合中的元素中个数:"+shardedJedis.zcard("zset"));
System.out.println("统计zset集合中权重某个范围内(1.0——5.0),元素的个数:"+shardedJedis.zcount("zset", 1.0, 5.0));
System.out.println("查看zset集合中element004的权重:"+shardedJedis.zscore("zset", "element004"));
System.out.println("查看下标1到2范围内的元素值:"+shardedJedis.zrange("zset", 1, 2));

}
private void HashOperate(){
System.out.println(shardedJedis.hset("hashs", "a1", "hello1"));
System.out.println(shardedJedis.hset("hashs", "a2", "hello2"));
System.out.println(shardedJedis.hset("hashs", "a3", "hello3"));
System.out.println(shardedJedis.hset("hashs", "a4", "hello4"));
System.out.println("获取hashs 中的所有value的值:"+shardedJedis.hvals("hashs"));
System.out.println("新增a4和5的整型键值对"+shardedJedis.hincrBy("hashs", "a5", 5));
System.out.println("删除hashs 中指定的值:"+shardedJedis.hdel("hashs", "a1"));
System.out.println("判断a5是否存在:"+shardedJedis.hexists("hashs", "a5"));
System.out.println("获取a4对应的值:"+shardedJedis.hget("hashs", "a4"));
//获取hash 中所有的key值
Map<String, String> hashmap = shardedJedis.hgetAll("hashs");
System.out.println("获取a4对应的值:"+hashmap.get("a4"));
System.out.println("批量获取hashs中的value值:"+shardedJedis.hmget("hashs", "a2","a3","a4"));
}
private void GeoOperate(){
System.out.println("记录用户的位置添加精度和纬度:"+shardedJedis.geoadd("seos", 37.8, 36.5, "user"));

System.out.println("记录用户的位置添加精度和纬度:"+shardedJedis.geoadd("seos", 38.8, 36.5, "user1"));
System.out.println("记录用户的位置添加精度和纬度:"+shardedJedis.geoadd("seos", 38.8, 37.5, "user2"));
System.out.println("记录用户的位置添加精度和纬度:"+shardedJedis.geoadd("seos", 40.8, 37.5, "user2"));
//GeoCoordinate unit = new GeoCoordinate(37.8, 36.5);
System.out.println("查找附近的人:"+shardedJedis.georadiusByMember("seos", "user", 100.0, GeoUnit.M));
}
}



redis 存储结构 String 和 hash和序列化存放 和json 存储的优缺点 http://my.oschina.net/yuyidi/blog/499951

[size=large][color=red]redis 存储字符串时候 set 和 setnx setex 区别 set 存储普通的键值对 setnx 存储也是普通键值对 在key 存在下,不做任何改变 不存在下 创建key 存储 。设置成功,返回 1 ;设置失败,返回 0 setex 设置键值对 并且设置key 存活的时间一秒为单位 key存在下改变key的值,成功返回ok 。 SETEX 是一个原子性(atomic)操作 时间单位为秒。其他4种数据类型可以对比来。按照官方的文档来说,以后可能回取消setnx setex命令 利用SET key value [EX seconds] [PX milliseconds] [NX|XX] ex表示秒时间 px 将键设置毫秒时间,NX只在键不存在时,对键操作 xx键存在时候对键操作.http://redisdoc.com/string/set.html
服务端和客服端下载:http://pan.baidu.com/s/1bXjToE[/color][/size]
redis 中geo 类型我测试一下,暂时没有做出来,百度看了看需要导入包,由于时间的关系,就没有仔细研究,等有时间可以好好研究,练习一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: