我们知道学习编程知识,先要搭建环境,首先需要下载redis工具包,下载时需要注意,redis的偶数版是表示稳定版(2.4,2.6等),奇数版表示非稳定版(2.5,2.7等),我下载的是2.6的,最新版本,我以前使用的是2.0版本的,发现好多命令不能使用,大家还是下载最新的稳定版比较好。
一、环境搭建:
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命令端的结果:
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 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类型的命令还有很多,我就不全部在命令端敲出来了,可以贴出来给大家看看:
删除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: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中的内容去网上下载
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();
}
}
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();
}
}
下面贴出运行结果:
======================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
======================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类型的值,今天就写这么多,刚开始学习,算是学习笔记吧,写的不好,还请多多包涵指正!