Redis 简介
Redis 是一种内存型数据存储,也可以将它写入磁盘中来实现耐久性。Redis 可通过两种方式来持久存储数据:RDB 和 AOF。RDB 持久性按照指定的间隔对您的数据集执行时间点快照。它不是非常耐久,而且您可能会丢失一些数据,但它非常快。AOF 的持久性要长得多,而且记录了服务器收到的每个写入操作。在查询 Redis 时,将从内存中获取数据,绝不会从磁盘获取数据,Redis 对内存中存储的键和值执行所有操作。
Redis 采用了一种客户端/服务器模型,借用该模型来监听 TCP 端口并接受命令。Redis 中的所有命令都是原子性的,所以您可以从不同的客户端处理同一个键,没有任何争用条件。如果您使用的是 memcached(一个内存型对象缓存系统),您会发现自己对它很熟悉,但 Redis(可以说)是 memcached++。Redis 也支持数据复制。
数据模型
Redis 数据模型不仅与关系数据库管理系统 (RDBMS) 不同,也不同于任何简单的 NoSQL 键-值数据存储。Redis 数据类型类似于编程语言的基础数据类型,所以开发人员感觉很自然。每个数据类型都支持适用于其类型的操作。受支持的数据类型包括:
- 字符串
- 列表
- 集合
- 有序集
- 哈希值
关键优势
Redis 的优势包括它的速度、它对富数据类型的支持、它的操作的原子性,以及它的通用性:
- Redis 非常快。它每秒可执行约 100,000 个 SET 以及约 100,000 个 GET 操作。您可以使用 redis-benchmark 程序在自己的机器上对它的性能进行基准测试。(redis-benchmark 模拟在它发送总共 M 个查询的同时,N 个客户端完成的 SET/GET 操作。)
- Redis 对大多数开发人员已知道的大多数数据类型提供了原生支持,这使得各种问题得以轻松解决。经验会告诉您哪个问题最好由何种数据类型来处理。
- 因为所有 Redis 操作都是原子性的,所以多个客户端会并发地访问一个 Redis 服务器,获取相同的更新值。
- Redis 是一个多效用工具,对许多用例很有用,这些用例包括缓存、消息队列(Redis 原生支持发布/订阅)、短期应用程序数据(比如 Web 会话、Web 页面命中计数)等。
Redis 安装
linux centos6.5安装
1. 使用离线包tar安装
(tar链接:http://pan.baidu.com/s/1qWvFXQO 密码:k5r6 )
wget http://download.redis.io/releases/redis-3.0.3.tar.gz
tar xzf redis-3.0.3.tar.gz
cd redis-3.0.3
make
#启动服务的
cd /src
./redis-server
#使用客户端 可以输入ping、info查看信息
./redis-cli
2. yum在线安装
yum install epel-release
yum install redis
#启动停止
service redis start/stop
#客户端
redis-cli
Redis 数据类型操作示例
下面分别介绍Redis 支持的数据类型的简单示例。
字符串(string)
redis> SET firstname shekhar
OK
redis> GET firstname
"shekhar"
如果您的键的值是整数,那么可使用 DECR 或 DECRBY 递减这些值,使用 INCR 或 INCRBY 递增它们。这些操作在您希望维护一些对象的数量(比如网页的命中次数)的情形中很有用
redis> INCR votes
(integer) 1
redis> INCR votes
(integer) 2
redis> INCR votes
(integer) 3
redis> DECR votes
(integer) 2
其他一些操作(包括 APPEND、GETRANGE、MSET 和 STRLENGTH 也可用于字符串。请参见http://doc.redisfans.com/string/index.html )
列表(list)
有序的字符串列表,按照插入顺序排序。Redis 中的列表是一个有序的字符串集合,您可以向其中添加任意数量的(惟一或非惟一)元素。除了向列表添加元素和从中获取元素的操作之外,Redis 还支持对列表使用取出、推送、范围和其他一些操作。
使用 LPUSH 命令,最近添加的单词位于列表顶部,以前添加的单词会在后面:
redis> LPUSH words austerity
(integer) 1
redis> LPUSH words socialism moratorium socialism socialism
(integer) 5
使用 LRANGE 命令查看列表中顶部的三个单词:
redis> LRANGE words 0 2
1) "socialism"
2) "socialism"
3) "moratorium"
获得列表的长度,可使用 LLEN 命令:
redis > LLEN words删除:
(integer) 5
#删除所有 socialism删除列表:
redis> LREM words 0 socialism
(integer) 2
redis 127.0.0.1:6379> DEL words
(integer) 1
集合(set)
集合(set)是惟一元素的无序集合。不可重复。
将一个元素添加到一个集合中,可使用 SADD 命令;要获取一个集合的所有成员,可使用 SMEMBERS 命令。
redis> SADD uniquewords austerity
(integer) 1
redis> SADD uniquewords socialism
(integer) 1
redis> SADD uniquewords socialism
(integer) 0
redis> SMEMBERS uniquewords
1) "austerity"
2) "socialism"
有序集(zset)
有序集合字符串列表,不可重复。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
假设您希望基于单词的长度对一组单词进行排序。使用 ZADD 命令将一个元素添加到一个有序集中,使用语法 ZADD 键分数 值。使用ZRANGE 命令按分数查看一个有序集的元素。
redis> ZADD wordswithlength 9 austerity要获得有序集的大小,可使用 ZCARD 命令:
(integer) 1
redis> ZADD wordswithlength 7 furtive
(integer) 1
redis> ZADD wordswithlength 5 bigot
(integer) 1
redis> ZRANGE wordswithlength 0 -1
1) "bigot"
2) "furtive"
3) "austerity"
redis 127.0.0.1:6379> ZCARD wordswithlength
(integer) 3
哈希值(hash)
hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
哈希值允许您针对一个哈希值存储一个键-值对。此选项可能对您希望保存具有多个属性的对象的情形很有用,就像以下示例一样:
redis> HSET user:1 name shekhar
(integer) 1
redis> HSET user:1 lastname gulati
(integer) 1
redis> HGET user:1
redis> HGET user:1 name
"shekhar"
redis> HGETALL user:1
1) "name"
2) "shekhar"
3) "lastname"
4) "gulati"
Redis IDE 工具使用(RedisDesktopManager)
1. 下载
链接:http://pan.baidu.com/s/1bnwg0OZ 密码:ekwu
使用java客户端 jedis操作redis
pom
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.1.0</version>
</dependency>
测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
redis.clients.jedis.Jedis;
public
class
TestRedis {
private
Jedis jedis;
public
TestRedis() {
jedis =
new
Jedis(
"123.59.42.xx"
,
6379
);
// 权限认证
// jedis.auth("admin");
}
/**
* redis存储字符串
*/
public
void
testString() {
jedis.set(
"name"
,
"Jerome苏"
);
jedis.expire(
"name"
,
60
);
// 设置存活时间
// jedis.del("name"); //删除某个键
System.out.println(
"name----->>>"
+ jedis.get(
"name"
));
}
/**
* redis操作Map
*/
public
void
testMap() {
Map<String, String> map =
new
HashMap<String, String>();
map.put(
"name"
,
"jerome"
);
map.put(
"age"
,
"24"
);
map.put(
"email"
,
"jerome_s@qq.com"
);
jedis.hmset(
"user"
, map);
// 存入redis
// 取出
List<String> rsmap = jedis.hmget(
"user"
,
"name"
,
"age"
);
System.out.println(rsmap);
// 删除map中的某个键值
// jedis.hdel("user", "age");
// System.out.println(jedis.hlen("user")); // 返回key为user的键中存放的值的个数2
// System.out.println(jedis.exists("user"));// 是否存在key为user的记录 返回true
// System.out.println(jedis.hkeys("user"));// 返回map对象中的所有key
// System.out.println(jedis.hvals("user"));// 返回map对象中的所有value
}
/**
* jedis操作List
*/
public
void
testList() {
// 开始前,先移除所有的内容
jedis.del(
"animals"
);
// -1表示取得所有
System.out.println(jedis.lrange(
"animals"
,
0
, -
1
));
// 存入List
jedis.lpush(
"animals"
,
"cat"
);
jedis.lpush(
"animals"
,
"dog"
);
jedis.lpush(
"animals"
,
"tiger"
);
System.out.println(jedis.lrange(
"animals"
,
0
, -
1
));
// 删除单个
jedis.rpush(
"animals"
,
"cat"
);
System.out.println(jedis.lrange(
"animals"
,
0
, -
1
));
}
/**
* jedis操作Set
*/
public
void
testSet() {
// 添加
jedis.sadd(
"user"
,
"jerome"
);
jedis.sadd(
"user"
,
"jelly"
);
jedis.sadd(
"user"
,
"jack"
);
jedis.sadd(
"user"
,
"nemo"
);
jedis.sadd(
"user"
,
"who"
);
// 移除noname
jedis.srem(
"user"
,
"who"
);
System.out.println(jedis.smembers(
"user"
));
// 获取所有加入的value
System.out.println(jedis.sismember(
"user"
,
"who"
));
// 判断 who是否是user集合的元素
System.out.println(jedis.srandmember(
"user"
));
System.out.println(jedis.scard(
"user"
));
// 返回集合的元素个数
}
/**
* redis排序
*
* @throws InterruptedException
*/
public
void
testSort()
throws
InterruptedException {
// 注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)
jedis.del(
"a"
);
// 先清除数据,再加入数据进行测试
jedis.rpush(
"a"
,
"1"
);
jedis.lpush(
"a"
,
"6"
);
jedis.lpush(
"a"
,
"3"
);
jedis.lpush(
"a"
,
"9"
);
System.out.println(jedis.lrange(
"a"
,
0
, -
1
));
// [9, 3, 6, 1]
System.out.println(jedis.sort(
"a"
));
// [1, 3, 6, 9] //输入排序后结果
System.out.println(jedis.lrange(
"a"
,
0
, -
1
));
}
public
static
void
main(String[] args) {
TestRedis redis =
new
TestRedis();
redis.testMap();
// RedisUtil.getJedis().set("newname", "中文测试");
// System.out.println(RedisUtil.getJedis().get("newname"));
}
}
|
使用连接池
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
import
redis.clients.jedis.Jedis;
import
redis.clients.jedis.JedisPool;
import
redis.clients.jedis.JedisPoolConfig;
public
final
class
RedisUtil {
// Redis服务器IP
private
static
String ADDR =
"192.168.0.100"
;
// Redis的端口号
private
static
int
PORT =
6379
;
// 访问密码
// private static String AUTH = "admin";
// 可用连接实例的最大数目,默认值为8;
// 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private
static
int
MAX_ACTIVE =
1024
;
// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private
static
int
MAX_IDLE =
200
;
// 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private
static
int
MAX_WAIT =
10000
;
private
static
int
TIMEOUT =
10000
;
// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private
static
boolean
TEST_ON_BORROW =
true
;
private
static
JedisPool jedisPool =
null
;
/**
* 初始化Redis连接池
*/
static
{
try
{
JedisPoolConfig config =
new
JedisPoolConfig();
config.setMaxActive(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWait(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
// jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);
jedisPool =
new
JedisPool(config, ADDR, PORT, TIMEOUT);
}
catch
(Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
*
* @return
*/
public
synchronized
static
Jedis getJedis() {
try
{
if
(jedisPool !=
null
) {
Jedis resource = jedisPool.getResource();
return
resource;
}
else
{
return
null
;
}
}
catch
(Exception e) {
e.printStackTrace();
return
null
;
}
}
/**
* 释放jedis资源
*
* @param jedis
*/
public
static
void
returnResource(
final
Jedis jedis) {
if
(jedis !=
null
) {
jedisPool.returnResource(jedis);
}
}
}
|
code: 链接:http://pan.baidu.com/s/1qW5PJic 密码:pyha
参考