Redis 简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Redis 事务:
1 MULTI 标记一个事务块的开始。2 DISCARD 取消事务,放弃执行事务块内的所有命令。
3 EXEC 执行所有事务块内的命令。
java 集成
java 开发客户端下载(这里只介绍jedis -- 原因是:开源,测试用例写得很全,用的人多查资料方便):1.导入依赖包:
commons-lang-2.5.jar
commons-pool2-2.4.2.jar
jedis-2.9.0.jar
包含上面3个jar 包的测试工程下载地址: http://download.csdn.net/download/tan3739/9994290
测试代码:
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.10.66", 16325);// Redis 数据库服务器的IP和端口
jedis.auth("12.1ekEJk234asdf1{}[]eu^&&$&#*($#kej:");// Redis 数据库服务器的密码
System.out.println("服务正在运行: "+jedis.ping());
jedis.set("site-list:100:title", "Try123456");
String re = jedis.get("site-list:100:title");
System.out.println("re:"+re);
System.out.println("连接成功");
jedis.close();
}
关于源码:
-
Jedis 的源码工程(导入 eclipse 可直接运行): http://download.csdn.net/download/tan3739/9994217
-
Jedis 的源码下载(仅含源码,手动导入jar包):http://download.csdn.net/download/tan3739/9993938
-
github 最新代码库: https://github.com/xetorthio/jedis
-
源码工程必看:
-
基本测试: src\redis\clients\jedis\tests\JedisTest.java
-
连接池测试: src\redis\clients\jedis\tests\JedisPoolTest.java
-
其它常用命令测试: src\redis\clients\jedis\tests\commands
密码
出于安全设置,Radis 默认只允许本机访问,要允许其它客户端也能访问,需要注释掉这一行: bind 127.0.0.1$ vi redis.conf
#bind 192.168.1.100 10.0.0.1
#bind 127.0.0.1 ::1
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#bind 127.0.0.1
其次再设置操作密码,注意客户端不用密码就能连接Redis,是操作的时候再检查密码,而Redis是可高并发访问的(150k/s),所以你的密码必须设置得足够复杂,以防被黑客破解。我下面设置的密码为:rek}j3jdiejdh&%^^*9039876A_+{U
$ vi redis.conf
requirepass rek}j3jdiejdh&%^^*9039876A_+{U
保存后重启Redis
设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。
输入密码的命令为:
AUTH password
$ auth rek}j3jdiejdh&%^^*9039876A_+{U
java jedis连接设置密码:
jedis.auth("rek}j3jdiejdh&%^^*9039876A_+{U");
持久化
语法: save 禁止持久化,注释以下几行:#save ""
#save 900 1
#save 300 10
#save 60 10000
这个查了一些资料,说 配置文件里面配置的save 持久化 调用的是bgsave,但本人并未去测试验证
只要禁止持久化,Redis 就是一台 memcached 服务器所以你只要学了Redis 就没有什么必要再去学 memcached。
简述小结:
Redis 虽然都是靠 key-value 键值对来存储对象,但其内部还是有分类型的, 主要是靠命令来区分类型,如get,set都是String(当然也可以是任意可持久化的对象哦);lpush、lpop 则是链表,sadd 是集合,zadd、zincrby、zrevrange 是有序集合Jedis开发
使用java开发redis,博主使用的是jedis,需要引入jedis的jar,可以在这里下载。还需要commons-pool.jar包
连接
Jedis jedis = new Jedis("10.10.195.112");
System.out.println(jedis.ping());
- 1
- 2
输出:PONG
操作字符串
jedis.set("name", "zzh");
System.out.println(jedis.get("name"));
- 1
- 2
输出:zzh
操作列表
jedis.lpush("nblist", "jj");
jedis.lpush("nblist", "jj");
jedis.lpush("nblist", "yy");
jedis.lpush("nblist", "qq");
List<String> list = jedis.lrange("nblist", 0, -1);
int length = list.size();
for(int i=0;i<length;i++)
{
System.out.println(list.get(i));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
输出:
qq
yy
jj
jj
- 1
- 2
- 3
- 4
获取redis中所有的键
Set<String> set = jedis.keys("*");
for(String key : set)
{
System.out.println(key);
}
- 1
- 2
- 3
- 4
- 5
输出:
nam
name
tutorial
list
tutorial-list
nblist
tutoriallist
keyname
user
listt
zsetkey
hash-key
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
Redis常用命令
1 连接操作命令
- quit:关闭连接(connection)
- auth:简单密码认证
- help cmd: 查看cmd帮助,例如:help quit
2 持久化
- save:将数据同步保存到磁盘
- bgsave:将数据异步保存到磁盘
- lastsave:返回上次成功将数据保存到磁盘的Unix时戳
- shutdown:将数据同步保存到磁盘,然后关闭服务
3 远程服务控制
- info:提供服务器的信息和统计
- monitor:实时转储收到的请求
- slaveof:改变复制策略设置
- config:在运行时配置Redis服务器
4 对key操作的命令
- exists(key):确认一个key是否存在
- del(key):删除一个key
- type(key):返回值的类型
- keys(pattern):返回满足给定pattern的所有key
- randomkey:随机返回key空间的一个
- keyrename(oldname, newname):重命名key
- dbsize:返回当前数据库中key的数目
- expire:设定一个key的活动时间(s)
- ttl:获得一个key的活动时间
- select(index):按索引查询
- move(key, dbindex):移动当前数据库中的key到dbindex数据库
- flushdb:删除当前选择数据库中的所有key
- flushall:删除所有数据库中的所有key
5 String
- set(key, value):给数据库中名称为key的string赋予值value
- get(key):返回数据库中名称为key的string的value
- getset(key, value):给名称为key的string赋予上一次的value
- mget(key1, key2,…, key N):返回库中多个string的value
- setnx(key, value):添加string,名称为key,值为value
- setex(key, time, value):向库中添加string,设定过期时间time
- mset(key N, value N):批量设置多个string的值
- msetnx(key N, value N):如果所有名称为key i的string都不存在
- incr(key):名称为key的string增1操作
- incrby(key, integer):名称为key的string增加integer
- decr(key):名称为key的string减1操作
- decrby(key, integer):名称为key的string减少integer
- append(key, value):名称为key的string的值附加value
- substr(key, start, end):返回名称为key的string的value的子串
6 List
- rpush(key, value):在名称为key的list尾添加一个值为value的元素
- lpush(key, value):在名称为key的list头添加一个值为value的 元素
- llen(key):返回名称为key的list的长度
- lrange(key, start, end):返回名称为key的list中start至end之间的元素
- ltrim(key, start, end):截取名称为key的list
- lindex(key, index):返回名称为key的list中index位置的元素
- lset(key, index, value):给名称为key的list中index位置的元素赋值
- lrem(key, count, value):删除count个key的list中值为value的元素
- lpop(key):返回并删除名称为key的list中的首元素
- rpop(key):返回并删除名称为key的list中的尾元素
- blpop(key1, key2,… key N, timeout):lpop命令的block版本。
- brpop(key1, key2,… key N, timeout):rpop的block版本。
- rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
7 Set
- sadd(key, member):向名称为key的set中添加元素member
- srem(key, member) :删除名称为key的set中的元素member
- spop(key) :随机返回并删除名称为key的set中一个元素
- smove(srckey, dstkey, member) :移到集合元素
- scard(key) :返回名称为key的set的基数
- sismember(key, member) :member是否是名称为key的set的元素
- sinter(key1, key2,…key N) :求交集
- sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
- sunion(key1, (keys)) :求并集
- sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
- sdiff(key1, (keys)) :求差集
- sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
- smembers(key) :返回名称为key的set的所有元素
- srandmember(key) :随机返回名称为key的set的一个元素
8 Hash
- hset(key, field, value):向名称为key的hash中添加元素field
- hget(key, field):返回名称为key的hash中field对应的value
- hmget(key, (fields)):返回名称为key的hash中field i对应的value
- hmset(key, (fields)):向名称为key的hash中添加元素field
- hincrby(key, field, integer):将名称为key的hash中field的value增加integer
- hexists(key, field):名称为key的hash中是否存在键为field的域
- hdel(key, field):删除名称为key的hash中键为field的域
- hlen(key):返回名称为key的hash中元素个数
- hkeys(key):返回名称为key的hash中所有键
- hvals(key):返回名称为key的hash中所有键对应的value
- hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
9 Zset
- zadd("zset", 3,"key1")):zset中添加元素,分数为3
- zadd("zset",map)):zset中添加元素map
其中:
Map<String,Double> map = new HashMap<>();
map.put("key2",1.2);
map.put("key3",1.2);
map.put("key4",5.0);
map.put("key5",0.2);