Redis之数据类型及命令
Redis(REmote DIctionary Server) 是一个遵守BSD协议、支持网络、可基于内存亦可持久化的日志型key-value存储系统。
KEY
常用指令:
指令
|
注释
|
备注
|
exits key
|
检测指定 key 是否存在
|
1 : 存在,0 : 不存在
|
del key1 key2......keyN
|
删除给定 key
|
返回删除 key 的数目,0 表示给定 key 都不存在
|
type key
|
返回给定 key 值的类型
|
none : key 不在 string : 字符类型
list : 链表类型 set : 无序集合类型
|
keys pattern
|
返回匹配指定模式的所有 key
|
|
randomkey
|
随机返回一个 key
|
如果当前数据库是空的,返回空串
|
rename oldkey newkey
|
重命名一个 key
|
如果 newkey 已存在,将会被覆盖newkey的值.
|
expire key seconds
|
设置key 的过期时间,单位是秒。
|
返回 1 : 成功,0 :key 不存在
|
ttl key
|
返回key的剩余过期秒数
|
-1 : key未设置过期时间, -2:key不存在
|
persist key
|
清除key的过期时间
|
1 : 成功 0:key不存在或者没有设置过期时间
|
VALUE
Redis 提供五种数据类型:String,Hash,List,Set 及 ZSet。
- String
String 是最基本的类型,而且 String 类型是二进制安全的,意思是 Redis 的 String 可以 包含任何数据。
常用指令:
指令
|
注释
|
例子
|
set key value
|
存数据
|
set username 'winn'
|
get key
|
取数据
|
get username
|
mset key1 value1... keyn valuen
|
一次存多个键值对
|
mset uname 'winn' pwd '123'
|
mget key1 ... keyn
|
一次取多个值
|
mget uname pwd
|
Java使用:
@Test
public void testString() {
public void testString() {
Jedis jedis = new Jedis("localhost");
jedis.set("name","winn");
System.out.println(jedis.get("name"));
jedis.set("name","winn");
System.out.println(jedis.get("name"));
//拼接
jedis.append("name", " is my lover");
System.out.println(jedis.get("name"));
jedis.append("name", " is my lover");
System.out.println(jedis.get("name"));
jedis.del("name");
System.out.println(jedis.get("name"));
System.out.println(jedis.get("name"));
//设置多个键值对
jedis.mset("name","winn","age","27","qq","174754613");
//进行加1操作
jedis.incr("age");
System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));//执行结果:winn-28-174754613
}
jedis.mset("name","winn","age","27","qq","174754613");
//进行加1操作
jedis.incr("age");
System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));//执行结果:winn-28-174754613
}
- Hash
Hash 是一个 String 类型的 field 和 value 的映射表,最大可以包含(2^32 -1)个键值对。增删操作的时间复杂度为 O(1)。
Hash 特别适合用于存储对象,将一个对象存储在 Hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。【省内存的原因是新建一个 Hash 对象时开始是用 zipmap(又称为 smallhash)来存储的。这个 zipmap 其实并不是hash table,但是 zipmap 相比正常的 hash 实现,可以节省不少 hash 本身需要的一些元数据存储开销。尽管 zipmap 的添加、删除、查找都是 O(n),但是由于一般对象的 field 数量都不太多,所以使用 zipmap的添加删除平均还是 O(1)。如果 field 或者 value的大小超出一定限制(在配置文件中指定)后,redis会在内部自动将zipmap替换成正常的hash实现.
#配置字段最多 64 个 hash-max-zipmap-entries 64 #配置 value 最大为 512 字节 hash-max-zipmap-value 512
常用指令:
指令
|
注释
|
例子
|
hmset key field1 value1 ... fieldn valuen
|
存数据
|
hmset user name 'winn' sex 'man'
|
hget key
|
取数据
|
hget user name
|
hgetall key
|
获取对象
|
|
HKEYS key
|
夺取对象中的所有filed
|
|
HVALS key
|
夺取对象中的所有value
|
|
@Test public void testHash(){
Jedis jedis = new Jedis("localhost"); Map<String, String> map = new HashMap<>(); map.put("name", "xinxin"); map.put("age", "22"); map.put("qq", "123456"); jedis.hmset("user",map); List<String> rsmap = jedis.hmget("user", "name", "age", "qq"); System.out.println(rsmap); //删除map中的某个键值 jedis.hdel("user","age"); System.out.println(jedis.hmget("user", "age")); //null //hlen 返回key中的field-value个数 System.out.println(jedis.hlen("user")); //2 //exists 判断key是否存在 System.out.println(jedis.exists("user"));//true //hkeys 返回所有的field System.out.println(jedis.hkeys("user"));//[name, qq] //hvals 返回所有的value System.out.println(jedis.hvals("user"));//[xinxin, 123456] Iterator<String> iter=jedis.hkeys("user").iterator(); while (iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+jedis.hmget("user",key)); } }
- List(双向链表类型)
List 是一个链表结构,可以理解为一个每个子元素都是 String 类型的双向链表。主要功能是 push、pop、获取一个范围内的所有值等。
常用指令:
指令
|
注释
|
例子
|
lpush listName value
|
将value存入list的表头
|
lpush listData demo
|
rpush listName value
|
将value存入list的表尾
|
rpush listData demo
|
lrange listName startIndex endIndex
|
返回下标在[startIndex, endIndex]中的值
|
lrange listData 0 10
|
Java使用:
@Test
public void testList(){
public void testList(){
Jedis jedis = new Jedis("localhost");
if(jedis.keys("*") != null){
jedis.flushDB();
}
//rpush : 在表尾添加数据
jedis.rpush("db","This","is","redis");
jedis.rpush("db","demo");
//lpush : 在表头添加数据
jedis.lpush("db","Begin : ");
if(jedis.keys("*") != null){
jedis.flushDB();
}
//rpush : 在表尾添加数据
jedis.rpush("db","This","is","redis");
jedis.rpush("db","demo");
//lpush : 在表头添加数据
jedis.lpush("db","Begin : ");
//lrange : 获取链表中的值 、 llen : 获取链表长度
System.out.println(jedis.lrange("db", 0, jedis.llen("db")));
//-1表示最后一个元素
System.out.println(jedis.lrange("db", 0, -1));
//排序 : 排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。
//System.out.println(jedis.sort("db"));
}
System.out.println(jedis.lrange("db", 0, jedis.llen("db")));
//-1表示最后一个元素
System.out.println(jedis.lrange("db", 0, -1));
//排序 : 排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。
//System.out.println(jedis.sort("db"));
}
- Set
Set 是无序集合,且不允许重复的成员。最大可以包含(2^32 -1)个元素。增删查操作的时间复杂度为 O(1)。
Set 的是通过 hashtable 实现的, hashtable 会随着添加或者删除自动的调整大小。 需要注意的是调整 hashtable 大小时候需要同步(获取写锁),会阻塞其他读写操作。
关于 Set 集合类型 除了基本的添加删除操作,还包含集合的取并集(union),交集(intersection), 差集(difference)。
常用指令:
指令
|
注释
|
例子
|
sadd key member
|
将value存入set
|
sadd setData set demo
|
smembers key
|
返回key中的数据 |
sembers setData
|
sismbers key
|
判断key是否存在 | sismembers setData |
SDIFF key1 [key2]
|
返回给定所有集合的差集
|
|
SINTER key1 [key2]
|
返回给定所有集合的交集
|
|
SUNION key1 [key2]
|
返回所有给定集合的并集
|
|
Java使用:
@Test public void testSet(){
Jedis jedis = new Jedis("localhost"); //添加 jedis.sadd("user","liuling"); jedis.sadd("user","xinxin"); jedis.sadd("user","ling"); jedis.sadd("user","zhangxinxin"); jedis.sadd("user","who"); //srem : 移除value 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"));//随机返回一个value System.out.println(jedis.scard("user"));//返回集合的元素个数
jedis.sadd("customer","ling");
jedis.sadd("customer","xinxin");
jedis.sadd("customer","winn");
jedis.sadd("customer","nicole");
jedis.sadd("customer","sam");
//并集
System.out.println(jedis.sunion("user","customer"));
//差集 : 返回user中customer不包含的value
System.out.println(jedis.sdiff("user","customer"));
//交集
System.out.println(jedis.sinter("user","customer"));
}
- ZSet(有序集合类型Sorted Set)
Sorted Set 是有序集合,且不允许重复的成员。它在 Set 的基础上增加了一个顺序属性(score),这一属性在添加修改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序。
常用指令:
指令
|
注释
|
例子
|
zadd key score member
|
存数据
|
zset zsetData 0 demo
|
zrange key startScore endScore [WITHSCORES]
|
取score在[startScore, endScore]之间的数据
|
zrange zsetData 0 10
|
Java使用:
@Test
public void testZSet(){
Jedis jedis = new Jedis("localhost");
jedis.zadd("user",1,"winn");
jedis.zadd("user",2,"sam");
jedis.zadd("user",5,"nicole");
jedis.zadd("user",4,"roy");
Set<String> user = jedis.zrange("user", 0, -1);
System.out.println(user);
}
补充
- 系统常用指令
指令
|
注释
|
备注
|
keys name
|
获取指定key
|
keys * 获取所有key
|
flushdb
|
清除当前数据库的所有数据
|
|
flushall
|
清除所有数据库的所有数据
|
|
besize
|
返回数据库中key的数量
|
|
config set field value | 设置系统参数 | config set maxmemory 100mb |
config get field | 查看系统参数 | config get maxmemory |
- Java使用Redis事务
/** * 使用事务 * Redis事务可以理解为一个打包的批量执行脚本,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。 * */ @Test public void testTrans() { //开启事务 Transaction tx = jedis.multi(); for (int i = 0; i < 1000; i++) { tx.set("t" + i, "t" + i); } //执行事务 tx.exec(); System.out.println(jedis.get("t100")); }
- 更多命令,请查看(全集)https://redis.io/commands
更多内容,请访问:http://www.cnblogs.com/BlueStarWei