redis全称是:REMOTE DICTIONARY SERVER,远程字典服务,它是以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。因为是内存读取,redis每秒可以读取数十万的健值数据。
先要搭建环境,首先需要下载redis工具包,下载时需要注意,redis的偶数版是表示稳定版(2.4,2.6等),奇数版表示非稳定版(2.5,2.7等),我下载的是2.6的,最新版本为2.8,大家还是下载最新的稳定版比较好。
一、环境搭建:
1、下载redis的压缩包,http://www.redis.io/(redis官网),下载好后解压下,然后配置环境变量,将redis-cli和redis-server所在地址配置在path中即可,因为是入门,我们只需要压缩包中的两个应用程序redis-cli.exe和redis-server.exe,打开redis-server.exe,这个就是redis服务器,服务器开启后是如下界面:
打开redis客户端可以使用两种方式
1、打开cmd,输入命令:redis-cli -h 127.0.0.1,点击enter就可以了,然后输入ping命令测试,返回pong表示连接服务成功
2、直接打开redis-cli.exe,测试是否连接成功方式同上; 如图:
接下来就可以使用redis命令了,redis中包含五中类型,(string,list,set,sortedset,hash)这票博客中只描述String类型,也是redis中最简单的类型:
========
1、字符串类型是redis中最基本的数据类型,可以存储任何形式的字符串,包括二进制数据,一个字符串类型健允许存储的最大容量是512M,字符串是其他几种数据类型的基础,只是对字符串的组织形式不一样罢了,比如列表是以列表的形式组织的字符串,集合是以集合的形式组织的字符串。
2、常用的字符串命令:
set key value:给key赋值
get key :取出key对应的值
incr key :给key的值加1,如果key对应的值是字符串,会报错(ERR value is not an integer or out of range),返回的是增加后的值,若key不存在,则默认key对应的值由0开始增加,相当于创建了set key 0
incrby key num:给key对应的值增加num,num为指定增加的数值
decr key:与incr key相反
decrby key num:与incrby key num相反
mset k1 v1 k2 v2 k3 v3:同时给k1,k2,k3赋值
mget k1 k2 k3:同时取出k1,k2,k3的值
下面是上面的命令在redis命令端的结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
redis
127.0
.
0.1
:
6379
> set name jack
OK
redis
127.0
.
0.1
:
6379
> get name
"jack"
redis
127.0
.
0.1
:
6379
> incr num
(integer)
1
redis
127.0
.
0.1
:
6379
> incr num
(integer)
2
redis
127.0
.
0.1
:
6379
> get num
"2"
redis
127.0
.
0.1
:
6379
> incrby num
5
(integer)
7
redis
127.0
.
0.1
:
6379
> get num
"7"
redis
127.0
.
0.1
:
6379
> decr num
(integer)
6
redis
127.0
.
0.1
:
6379
> get num
"6"
redis
127.0
.
0.1
:
6379
> mset stu1 zhangsan stu2 lisi stu3 wangwu
OK
redis
127.0
.
0.1
:
6379
> mget stu1 stu2 stu3
1
)
"zhangsan"
2
)
"lisi"
3
)
"wangwu"
|
当然,redis针对string类型的命令还有很多,我就不全部在命令端敲出来了,可以贴出来给大家看看:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
删除redis:del name 返回删除key数量
测试指定key是否存在:exists name
1
-存在,
0
-不存在
type key:返回key 的类型;string,list,hash,set,sortedset
keyspattern:匹配key,比如keys n* ->name
randomkey:随机返回库中 的一个key
raname oldkey newkey 重命名key,如果key存在,覆盖
renamenx oldkey newkey 重命名key,如果key存在,返回失败
dbsize 返回key的数量
expire key seconds :为可以设置过期时间,单位秒,返回
1
表成功,
0
表示已经设置过或者key不存在
ttl key 返回设置过过期时间的 key的剩余过期秒数 -
1
表示 key不存在或者没有设置过过期时间
select db-index 通过索引选择数据库,默认连接的数据库所有是
0
,默认数据库数是
16
个。返回
1
表
示成功,
0
失败
move key db-index 将 key从当前数据库移动到指定数据库。返回
1
成功。
0
如果key不存在,或
者已经在指定数据库中
flushdb 删除当前数据库中所有 key,此方法不会失败。慎用
flushall 删除所有数据库中的所有key,此方法不会失败。更加慎用
append key value 给指定key的字符串值追加 value,返回新字符串值的长度。
substr key start end 返回截取过的 key的字符串值,注意并不修改 key的值,下标是从
0
开始的。
|
根据需要自己来使用响应的命令即可。
redis也支持很多的程序语言,发展速度很快,我这边示例java程序对redis的操作,也只贴出对string类型的操作:我使用的jedis的jar包是jedis-2.1.0.jar,当然程序中还需要别的jar包,大家可以根据我程序中import中的内容去网上下载
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
package
org.laoyao.redisTest;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.Iterator;
import
java.util.List;
import
java.util.Map;
import
java.util.Set;
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 jedis;
// 非切片额客户端连接
private
JedisPool jedisPool;
// 非切片连接池
private
ShardedJedis shardedJedis;
// 切片额客户端连接
private
ShardedJedisPool shardedJedisPool;
// 切片连接池
public
RedisTest() {
initialPool();
initialShardedPool();
shardedJedis = shardedJedisPool.getResource();
jedis = jedisPool.getResource();
}
/**
* 初始化非切片池
*/
private
void
initialPool() {
// 池基本配置
JedisPoolConfig config =
new
JedisPoolConfig();
config.setMaxActive(
20
);
config.setMaxIdle(
5
);
config.setMaxWait(1000l);
config.setTestOnBorrow(
false
);
jedisPool =
new
JedisPool(config,
"127.0.0.1"
,
6379
);
}
/**
* 初始化切片池
*/
private
void
initialShardedPool() {
// 池基本配置
JedisPoolConfig config =
new
JedisPoolConfig();
config.setMaxActive(
20
);
config.setMaxIdle(
5
);
config.setMaxWait(1000l);
config.setTestOnBorrow(
false
);
// slave链接
List shards =
new
ArrayList();
shards.add(
new
JedisShardInfo(
"10.22.19.167"
,
6379
,
"master"
));
// 构造池
shardedJedisPool =
new
ShardedJedisPool(config, shards);
}
private
void
StringOperate() {
System.out.println(
"======================String_1=========================="
);
// 清空数据
System.out.println(
"清空库中所有数据:"
+ jedis.flushDB());
System.out.println(
"=============增============="
);
jedis.set(
"key001"
,
"value001"
);
jedis.set(
"key002"
,
"value002"
);
jedis.set(
"key003"
,
"value003"
);
System.out.println(
"已新增的3个键值对如下:"
);
System.out.println(jedis.get(
"key001"
));
System.out.println(jedis.get(
"key002"
));
System.out.println(jedis.get(
"key003"
));
System.out.println(
"=============删============="
);
System.out.println(
"删除key003键值对:"
+ jedis.del(
"key003"
));
System.out.println(
"获取key003键对应的值:"
+ jedis.get(
"key003"
));
System.out.println(
"=============改============="
);
// 1、直接覆盖原来的数据
System.out.println(
"直接覆盖key001原来的数据:"
+ jedis.set(
"key001"
,
"value001-update"
));
System.out.println(
"获取key001对应的新值:"
+ jedis.get(
"key001"
));
// 2、直接覆盖原来的数据
System.out.println(
"在key002原来值后面追加:"
+ jedis.append(
"key002"
,
"+appendString"
));
System.out.println(
"获取key002对应的新值"
+ jedis.get(
"key002"
));
System.out.println(
"=============增,删,查(多个)============="
);
/**
* mset,mget同时新增,修改,查询多个键值对 等价于: jedis.set("name","ssss"); jedis.set("jarorwar","xxxx");
*/
System.out.println(
"一次性新增key201,key202,key203,key204及其对应值:"
+ jedis.mset(
"key201"
,
"value201"
,
"key202"
,
"value202"
,
"key203"
,
"value203"
,
"key204"
,
"value204"
));
System.out.println(
"一次性获取key201,key202,key203,key204各自对应的值:"
+ jedis.mget(
"key201"
,
"key202"
,
"key203"
,
"key204"
));
System.out.println(
"一次性删除key201,key202:"
+ jedis.del(
new
String[] {
"key201"
,
"key202"
}));
System.out.println(
"一次性获取key201,key202,key203,key204各自对应的值:"
+ jedis.mget(
"key201"
,
"key202"
,
"key203"
,
"key204"
));
System.out.println();
// jedis具备的功能shardedJedis中也可直接使用,下面测试一些前面没用过的方法
System.out.println(
"======================String_2=========================="
);
// 清空数据
System.out.println(
"清空库中所有数据:"
+ jedis.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
));
}
public
static
void
main(String[] args) {
new
RedisTest().StringOperate();
}
}
|
下面贴出运行结果:
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
|
======================String_1==========================
清空库中所有数据:OK
=============增=============
已新增的
3
个键值对如下:
value001
value002
value003
=============删=============
删除key003键值对:
1
获取key003键对应的值:
null
=============改=============
直接覆盖key001原来的数据:OK
获取key001对应的新值:value001-update
在key002原来值后面追加:
21
获取key002对应的新值value002+appendString
=============增,删,查(多个)=============
一次性新增key201,key202,key203,key204及其对应值:OK
一次性获取key201,key202,key203,key204各自对应的值:[value201, value202, value203, value204]
一次性删除key201,key202:
2
一次性获取key201,key202,key203,key204各自对应的值:[
null
,
null
, value203, value204]
======================String_2==========================
清空库中所有数据:OK
=============新增键值对时防止覆盖原先值=============
原先key301不存在时,新增key301:
1
原先key302不存在时,新增key302:
1
当key302存在时,尝试新增key302:
0
获取key301对应的值:value301
获取key302对应的值:value302
=============超过有效期键值对被删除=============
新增key303,并指定过期时间为
2
秒OK
获取key303对应的值:key303-2second
3
秒之后,获取key303对应的值:
null
=============获取原值,更新为新值一步完成=============
key302原值:value302
key302新值:value302-after-getset
=============获取子串=============
获取key302对应值中的子串:
302
|
总结:redis对string类型的操作是非常简单的,redis本来就是一个简单的东西,string类型是其余各种类型的基础,其余各种类型(list、set、sortedset、hash)最终保存的依然是string类型的值,今天就写这么多,刚开始学习,算是学习笔记吧,写的不好,还请多多包涵指正!