一、NoSql
1.NoSql
NoSql(not only SQL)。是一种全新的数据库理念,泛指非关系型数据库
随着web2.0的兴起,关系型数据库对于超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,而非关系型数据库则满足三个特点:
1)High performance——高并发读写
2)Huge Storage——对海量数据的高效率存储和访问
3)High Scalability && High Availability ——高可拓展性和高可用性
2.主流NoSql产品
Redis MongoDB 等
3.Nosql数据库的四大分类
1)键值(key-value)存储数据库
相关产品:Redis、TokyoCabinet/Tyrant
典型应用:内容缓存,主要用于处理大量数据的高访问负载
数据模型:一系列键值对
优势:快速查询
劣势:存储的数据缺少结构化
2)列存储数据库
相关产品:Casssandra、HBase,Riak
典型应用:分布式的文件系统
数据模型:以列簇式存储,将同一列数据存在一起
优势:查找速度快,可拓展性强,容易进行分布式扩展
劣势:功能相对局限
3)文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与key-value类似,Value是结构化的)
数据模型:一系列键值对
优势:数据结构要求不严格
劣势:查询性能不高,而且缺乏统一的查询语法
4)图形(Graph)数据库
相关产品:Neo4J、InfoGrid
典型应用:社交网络
数据模型:图结构
优势:利用图结构相关算法
劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案
4.NoSql的特点:
在大数据存取上具备关系型数据库无法比拟的性能优势,例如:
1)易拓展
2)大数据量,高性能
3)灵活的数据模型
4)高可用
二:Redis
1.Redis是用C语言开发的一个开源的高性能键值对数据库,它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1)字符串类型
2)散列类型
3)列表类型
4)集合类型
5)有序集合类型
2.应用场景:
缓存(最多)
聊天室的在线好友列表
任务队列(秒杀、抢购等)
应用排行榜
网站访问统计
数据过期处理(可以精确到毫秒)
分布式集群结构中的session分离
3.Redis方法
Object get(String key); //获取数据
void set(String key , Object value); //插入数据
三、Jedis
Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如Java、C、C++、C#、php、Node.js、Go等
Java中常用的是Jedis
1.Java连接Redis(先导包)
1)获得单一的jedis对象操作数据库
@Test
public void test1() {
//1.获得连接对象
//如果你的Redis客户端没有设置访问密码的话,可以直接使用下面的构造方法,如果设置了密码,则使用JedisShardInfo 对象来设置访问配置
// Jedis jedis = new Jedis("192.168.0.1", 6379);
JedisShardInfo shardInfo = new JedisShardInfo("redis://192.168.0.1:6379");//这里是连接的本地地址和端口
shardInfo.setPassword("123456");//这里是密码
Jedis jedis = new Jedis(shardInfo);
//2.获得数据
String username = jedis.get("username");
System.out.println(username);
//3.存储数据
jedis.set("addr", "南京") ;
System.out.println(jedis.get("addr"));
}
2)连接池连接
@Test
public void test2() {
//0.创建池子的配置对象
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(30); //最大闲置个数,超过30个闲置的就开始关
poolConfig.setMinIdle(10); //最小闲置个数,最少保持有10个是闲置的,低于10个的时候就开始增
poolConfig.setMaxTotal(50); //最大连接数
//1.创建一个redis连接池
/**
* JedisPool(GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password)
* poolConfig:连接池配置对象
* host:连接ip
* port:端口号,通常为6379
* timeout:连接超时时间,单位 毫秒
* password:连接密码
*/
JedisPool pool = new JedisPool(poolConfig, "192.168.0.1", 6379,2000,"123456");
//2.从池子中获取redis的连接资源
Jedis jedis = pool.getResource();
//3.操作数据库
jedis.set("age", "23");
System.out.println(jedis.get("age"));
//4.关闭资源
jedis.close();
pool.close(); //日常使用并不用关闭连接池
}
类似数据库的连接池,Redis的连接代码也可以提取为一个简单工具类,具体配置参数放在一个properties文件中,具体代码如下:
工具类:
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolUtils {
private static JedisPool pool = null;
static {
//配置对象不用每次都创建,只需要创建一次,因此写在静态代码区域
//配置信息写在配置文件中,方便统一管理
//加载配置文件
InputStream redisResource = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties");
Properties pro = new Properties();
try {
pro.load(redisResource);
} catch (IOException e) {
e.printStackTrace();
}
//0.创建池子的配置对象
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(Integer.parseInt(pro.get("redis.maxIdle").toString())); //最大闲置个数,超过30个闲置的就开始关
poolConfig.setMinIdle(Integer.parseInt(pro.get("redis.minIdle").toString())); //最小闲置个数,最少保持有10个是闲置的,低于10个的时候就开始增
poolConfig.setMaxTotal(Integer.parseInt(pro.get("redis.maxTotal").toString())); //最大连接数
//1.创建一个redis连接池
/**
* JedisPool(GenericObjectPoolConfig poolConfig, String host, int port, int timeout, String password)
* poolConfig:连接池配置对象
* host:连接ip
* port:端口号,通常为6379
* timeout:连接超时时间,单位 毫秒
* password:连接密码
*/
pool = new JedisPool(poolConfig, pro.get("redis.url").toString(), Integer.parseInt(pro.get("redis.port").toString()),Integer.parseInt(pro.get("redis.timeout").toString()),pro.get("redis.password").toString());
}
//获取连接资源方法
public static Jedis getResource() {
return pool.getResource();
}
}
//其他方法
配置文件redis.properties(创建在src下):
redis.maxIdle=30
redis.minIdle=10
redis.maxTotal=100
redis.url=192.168.0.1
redis.port=6379
redis.timeout=2000
redis.password=123456
@Test
public void test2() {
//2.从池子中获取redis的连接资源
Jedis jedis = JedisPoolUtils.getResource();
//3.操作数据库
jedis.set("age", "23");
System.out.println(jedis.get("age"));
//4.关闭资源
jedis.close();
}
5.Redis数据结构
1)Redis是一种高级的key-value的存储系统,其中value支持五中数据类型
字符串(String)
哈希(hash)
字符串列表(list)
字符串集合(set)
有序字符串集合(sorted set)
2)关于key的定义,需要注意以下:
1.key不要太长,最好不要超过1024个字节,这不仅会消耗内存还会降低查询效率
2.key不要太短,如果太短会降低key的可读性
3.在项目中,key最好有一个统一的命名规范
5.1 存储String
字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这 便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。 在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
常用命令:
1)赋值
set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK
2)取值
get key:获取key的value。如果与该key关联的value不是String类型,redis将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回null。
getset key value:先获取该key的值,然后在设置该key的值
3)删除
del key :删除指定的key
4)数值增减
incr key:将指定的key的value原子性的递增1.如果该key不存在,其初始值 为0,在incr之后其值为1。如果value的值不能转成整型,如hello,该操作将执 行失败并返回相应的错误信息。
decr key:将指定的key的value原子性的递减1.如果该key不存在,其初始值为0,在incr之后其值为-1。如果value的值不能转成整型,如hello,该操作将执 行失败并返回相应的错误信息。
incrby key increment:将指定的key的value原子性增加increment,如果该 key不存在,器初始值为0,在incrby之后,该值为increment。如果该值不能转成 整型,如hello则失败并返回错误信息
decrby key decrement:将指定的key的value原子性减少decrement,如果 该key不存在,器初始值为0,在decrby之后,该值为decrement。如果该值不能 转成整型,如hello则失败并返回错误信息
腾讯云服务器redis:0>set username zhangsan
"OK"
腾讯云服务器redis:0>get username
"zhangsan"
腾讯云服务器redis:0>getset username lisi
"zhangsan"
腾讯云服务器redis:0>get username
"lisi"
腾讯云服务器redis:0>del age
"0"
腾讯云服务器redis:0>del username
"1"
腾讯云服务器redis:0>set username zhang
"OK"
腾讯云服务器redis:0>set age 25
"OK"
腾讯云服务器redis:0>incr age
"26"
腾讯云服务器redis:0>decr age
"25"
腾讯云服务器redis:0>incrby age 10
"35"
腾讯云服务器redis:0>decrby age 5
"30"
5.2 存储hash
Redis中的Hashes类型可以看成具有String Key和String Value的map容器。所以该类型非常适合于存储值对象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
常用命令:
1)赋值
hset key field value:为指定的key设定field/value对(键值对)
hmset key fields:设置key中的多个filed/value
2)取值
hgetall key:获取key中的所有filed-vaule
hmget key fileds:获取key中的多个filed的值
hget key field:返回指定的key中的field的值
3)删除
del key:删除指定key
hdel key field1 field2 filed3…:可以删除一个或多个字段,返回值是被删除的字段的个数
4)增加数字
hincrby key field increment:设置key中filed的值增加increment,如:age增加20,如果是负数则是减
5)其他
hexists key field:判断指定的key中的filed是否存在
hlen key:获取key所包含的field的数量
hkeys key :获得所有的key
hvals key:获得所有的value
腾讯云服务器redis:0> hset myhash name zhangsan
"1"
腾讯云服务器redis:0>hmset myhash age 25 addr nanjing
"OK"
腾讯云服务器redis:0>hgetall myhash
1) "name"
2) "zhangsan"
3) "age"
4) "25"
5) "addr"
6) "nanjing"
腾讯云服务器redis:0>hmget myhash name age
1) "zhangsan"
2) "25"
腾讯云服务器redis:0>hget myhash addr
"nanjing"
腾讯云服务器redis:0>hdel myhash age addr
"2"
腾讯云服务器redis:0>hgetall myhash
1) "name"
2) "zhangsan"
腾讯云服务器redis:0>hmset myhash age 18 addr beijing
"OK"
腾讯云服务器redis:0>hincrby myhash age 20
"38"
腾讯云服务器redis:0>hincrby myhash age -15
"23"
腾讯云服务器redis:0>hexists myhash name
"1"
腾讯云服务器redis:0>hexists myhash username
"0"
腾讯云服务器redis:0>hlen myhash
"3"
腾讯云服务器redis:0>hkeys myhash
1) "name"
2) "age"
3) "addr"
腾讯云服务器redis:0>hvals myhash
1) "zhangsan"
2) "23"
3) "beijing"
5.3存储list
在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是 4294967295。
从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。
常用命令:
1)两端添加:
lpush key value1 value2…:在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
rpush key value1、value2…:在该list的尾部添加元素
2)查看链表
lrange key start end:获取链表中从start到end的元素的值,start、end可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…从左向右为0到N,从右到左为-1到-N;start为0且end为-1表示从头查到尾;
3)两端弹出
lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。
rpop key:从尾部弹出元素。
4)获取元素个数
llen key:返回指定的key关联的链表中的元素的数量。
5)其他
lpushx key value:仅当参数中指定的key存在时(如果与key管理的list中没有值时,则该key是不存在的)在指定的key所关联的list的头部插入value。
rpushx key value:在该list的尾部添加元素
lrem key count value:删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。
lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。
linsert key before|after pivot value:在pivot元素前或者后插入value这个元素。
rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部
注:rpoplpush的使用场景:Redis经常被用于消息队列的服务,以完成多个程序之间的信息交换,假设一个应用程序正在执行lpush操作向链表中添加新元素,我们通常将这样的程序称之为“生产者(Producer)”,而另一个应用程序正在执行rpop操作从链表中取出元素,我们称这样的程序为“消费者(Consumer)”。如果此时消费者在取出元素后立即崩溃,由于该消息已经被取出且没有被正常处理,那我们就可以认为该消息已经丢失,由此可能导致业务数据丢失,或业务状态的不一致现象的发生。然而通过使用rpoplpush命令,消费者程序在从消息队列中取出消息之后再将其插入到备份队列中,直到消费者程序在完成正常的逻辑处理后再将该消息从备份队列中删除。同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其他消费程序使用。
腾讯云服务器redis:0>lrange mylist 0 -1
1) "3"
2) "2"
3) "1"
4) "c"
5) "b"
6) "a"
腾讯云服务器redis:0>lrange mylist 0 3
1) "3"
2) "2"
3) "1"
4) "c"
腾讯云服务器redis:0>lpop mylist
"3"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "2"
2) "1"
3) "c"
4) "b"
5) "a"
腾讯云服务器redis:0>rpop mylist
"a"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "2"
2) "1"
3) "c"
4) "b"
腾讯云服务器redis:0>llen mylist
"4"
腾讯云服务器redis:0>lpushx mylist a
"5"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "1"
4) "c"
5) "b"
腾讯云服务器redis:0>lpushx yourlist a
"0"
腾讯云服务器redis:0>rpushx mylist 5 6 7
"8"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "1"
4) "c"
5) "b"
6) "5"
7) "6"
8) "7"
腾讯云服务器redis:0>rpushx mylist 1 2 2 1 3 4 5
"15"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "1"
4) "c"
5) "b"
6) "5"
7) "6"
8) "7"
9) "1"
10) "2"
11) "2"
12) "1"
13) "3"
14) "4"
15) "5"
腾讯云服务器redis:0>lrem mylist 2 1
"2"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "c"
4) "b"
5) "5"
6) "6"
7) "7"
8) "2"
9) "2"
10) "1"
11) "3"
12) "4"
13) "5"
腾讯云服务器redis:0>lrem mylist -2 2
"2"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "c"
4) "b"
5) "5"
6) "6"
7) "7"
8) "1"
9) "3"
10) "4"
11) "5"
腾讯云服务器redis:0>lset mylist 3 d
"OK"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "c"
4) "d"
5) "5"
6) "6"
7) "7"
8) "1"
9) "3"
10) "4"
11) "5"
腾讯云服务器redis:0>linsert mylist after d e
"12"
腾讯云服务器redis:0>lrange mylist 0 -1
1) "a"
2) "2"
3) "c"
4) "d"
5) "e"
6) "5"
7) "6"
8) "7"
9) "1"
10) "3"
11) "4"
12) "5"
腾讯云服务器redis:0>lpush mylist2 1 2 3
"3"
腾讯云服务器redis:0>lpush mylist3 a b c
"3"
腾讯云服务器redis:0>rpoplpush mylist2 mylist3
"1"
腾讯云服务器redis:0>lrange mylist2 0 -1
1) "3"
2) "2"
腾讯云服务器redis:0>lrange mylist3 0 -1
1) "1"
2) "c"
3) "b"
4) "a"
5.4 存储set
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我 们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间是常量时间。Set可包含的最大元素数是4294967295。
和List类型不同的是,Set集合中不允许出现重复的元素。和List类型相比,Set类 型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计 算操作,如unions、intersections和differences。由于这些操作均在服务端完成, 因此效率极高,而且也节省了大量的网络IO开销
常用命令:
1)添加/删除元素
sadd key value1、value2…:向set中添加数据,如果该key的值已有则不会重复添加
srem key member1、member2…:删除set中指定的成员
2)获取元素
smembers key:获取set中所有的成员
sismember key member:判断参数中指定的成员是否在该set中,1表示存 在,0表示不存在或者该key本身就不存在
3)集合的交并差运算
sinter key[key1,key2…]:返回交集
sunion key1、key2:返回并集
sdiff key1 key2:返回key1与key2中相差的成员,而且与key的顺序有关。即返回差集。
sinterstore destination key1 key2:将返回的交集存储在destination上
sunionstore destination key1 key2:将返回的并集存储在destination上
sdiffstore destination key1 key2:将key1、key2相差的成员存储在destination上
4)其他
scard key:获取set中成员的数量
使用场景:
1.可以使用redis 的set确保数据的唯一性,比如访问某一博客的唯一ip地址,我们仅需要在每次访问该博客时将访问者的IP存入Redis,set数据类型会自动保证IP地址的唯一性
2.充分利用set类型的服务端聚合操作方便、高效的特点,可以用于维护数据对象之间的关联关系。
腾讯云服务器redis:0>sadd myset aa bb cc
"3"
腾讯云服务器redis:0>srem myset cc
"1"
腾讯云服务器redis:0>smembers myset
1) "aa"
2) "bb"
腾讯云服务器redis:0>sismember myset cc
"0"
腾讯云服务器redis:0>sismember myset aa
"1"
腾讯云服务器redis:0>sadd yourset bb cc dd ee
"4"
腾讯云服务器redis:0>sadd myset cc
"1"
腾讯云服务器redis:0>smembers myset
1) "aa"
2) "cc"
3) "bb"
腾讯云服务器redis:0>smembers yourset
1) "cc"
2) "ee"
3) "dd"
4) "bb"
腾讯云服务器redis:0>sinter myset yourset
1) "cc"
2) "bb"
腾讯云服务器redis:0>sunion myset yourset
1) "cc"
2) "ee"
3) "bb"
4) "aa"
5) "dd"
腾讯云服务器redis:0>sdiff myset yourset
1) "aa"
腾讯云服务器redis:0>sinterstore hisset myset yourset
"2"
腾讯云服务器redis:0>smembers hisset
1) "cc"
2) "bb"
腾讯云服务器redis:0>sunionstore herset myset yourset
"5"
腾讯云服务器redis:0>smembers herset
1) "cc"
2) "ee"
3) "bb"
4) "aa"
5) "dd"
腾讯云服务器redis:0>sdiffstore itsset myset yourset
"1"
腾讯云服务器redis:0>smembers itsset
1) "aa"
腾讯云服务器redis:0>scard myset
"3"
5.5存储sortedset
Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score) 却是可以重复的。
在Sorted-Set中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于Sorted-Sets中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和Redis 同样的高效,在其它数据库中进行建模是非常困难的。
例如:游戏排名、微博热点话题等使用场景。
常用命令:
1)添加元素
zadd key score member score2 member2 … :将所有成员以及该成员的分数存放到sorted-set中
2)获得元素
zscore key member:返回指定成员的分数
zcard key:获取集合中的成员数量
3)删除元素
zrem key member[member…]:移除集合中指定的成员,可以指定多个成员。
4)范围查询
zrange key start end [withscores]:获取集合中脚标为start-end的成员,[withscores]参数表明返回的成员包含其分数
zrevrange key start stop [withScore]:按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
zremrangebyrank key start stop:按照排名范围删除元素
zremrangebyscore key start stop:按照分数范围删除元素
5)扩展命令:
zrevrangebyscore key min max[withscores] [limit offset count]:返回分数在[min,max]
的成员并按照分数从高到低排序。wihthscores:显示分数 [limit offset with]、offset表明从脚标为offset的元素开始并返回count的成员
zincrby key increment member:设置指定成员的增加的分数。
zcount key min max:获取分数在[min,max]之间的成员
腾讯云服务器redis:0>zadd mysortedset 100 zhangsan 70 lisi 50 wangwu 30 zhaoliu
"4"
腾讯云服务器redis:0>zscore mysortedset zhangsan
"100"
腾讯云服务器redis:0>zscore mysortedset wangwu
"50"
腾讯云服务器redis:0>zcard mysortedset
"4"
腾讯云服务器redis:0>zrem mysortedset wangwu
"1"
腾讯云服务器redis:0>zrange mysortedset 40 90
腾讯云服务器redis:0>zrange mysortedset 0 -1
1) "zhaoliu"
2) "lisi"
3) "zhangsan"
腾讯云服务器redis:0>zrevrange mysortedset 0 -1 withscores
1) "zhangsan"
2) "100"
3) "lisi"
4) "70"
5) "zhaoliu"
6) "30"
腾讯云服务器redis:0>zremrangebyrank mysortedset 1 2
"2"
腾讯云服务器redis:0>zrevrange mysortedset 0 -1 withscores
1) "zhaoliu"
2) "30"
腾讯云服务器redis:0>zremrangebyscore mysortedset 10 20
"0"
腾讯云服务器redis:0>zremrangebyscore mysortedset 10 30
"1"
腾讯云服务器redis:0>zrevrange mysortedset 0 -1 withscores
5.6 Redis的通用操作
keys pattern :获取所有与pattern匹配的key,返回所有与该key匹配的keys,*表示任意一个或多个字符,?表示任意一个字符。
del key1 key2 …:删除指定的key
exists key:判断该key是否存在,1表示存在,0表示不存在
rename key newkey:为当前的key重命名
expire key:设置过期时间,单位 秒
ttl key:获取该key所剩的超时时间,如果没有设置超时,返回-1,如果返回-2表示超时不存在
type key:获取指定key的类型,命令将以字符串的格式返回,返回的字符串为string、list、set、hash、和zset,如果key不存在返回none
腾讯云服务器redis:0>keys *
1) "itsset"
2) "yourset"
3) "myhash"
4) "age"
5) "username"
6) "runtime"
7) "myset"
8) "herset"
9) "hisset"
10) "mylist3"
11) "caches"
12) "mylist"
13) "mylist2"
腾讯云服务器redis:0>keys *list?
1) "mylist3"
2) "mylist2"
腾讯云服务器redis:0>del itsset
"1"
腾讯云服务器redis:0>exists mylist
"1"
腾讯云服务器redis:0>rename mylist mylist1
"OK"
腾讯云服务器redis:0>expire mylist3 60
"1"
腾讯云服务器redis:0>ttl mylist3
"42"
腾讯云服务器redis:0>ttl mylist3
"39"
腾讯云服务器redis:0>type mylist
"none"
腾讯云服务器redis:0>type mylist3
"list"
5.7 Redis特性
1)多数据库
一个Redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多个数据库,客户端连接时指定连接哪个数据库。
选择数据库:select N
2)移库
将这个数据库下的key移植到另一个库中(当前库则被删除)
腾讯云服务器redis:0>select 1
"OK"
腾讯云服务器redis:1>keys *
腾讯云服务器redis:1>select 0
"OK"
腾讯云服务器redis:0>keys *
1) "yourset"
2) "myhash"
3) "age"
4) "username"
5) "runtime"
6) "myset"
7) "herset"
8) "hisset"
9) "caches"
10) "mylist1"
11) "mylist2"
腾讯云服务器redis:0>move age 1
"1"
腾讯云服务器redis:0>keys *
1) "yourset"
2) "myhash"
3) "username"
4) "runtime"
5) "myset"
6) "herset"
7) "hisset"
8) "caches"
9) "mylist1"
10) "mylist2"
腾讯云服务器redis:0>select 1
"OK"
腾讯云服务器redis:1>keys *
1) "age"
腾讯云服务器redis:1>