Nosql
1、什么是nosql
为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案,就是NoSql。
NoSql,叫非关系型数据库,它的全名Not only sql。它不能替代关系型数据库,只能作为关系型数据库的一个良好补充。
分类
1、键值(Key-Value)存储数据库 相关产品: Tokyo
Cabinet/Tyrant、Redis、Voldemort、Berkeley DB 典型应用:
内容缓存,主要用于处理大量数据的高访问负载。
数据模型: 一系列键值对 优势: 快速查询 劣势: 存储的数据缺少结构化。
2、列存储数据库 相关产品:Cassandra, HBase, Riak 典型应用:分布式的文件系统。
数据模型:以列簇式存储,将同一列数据存在一起 优势:查找速度快,可扩展性强,更容易进行分布式扩展 劣势:功能相对局限。3、文档型数据库 相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-Value类似,Value是结构化的)
数据模型: 一系列键值对 优势:数据结构要求不严格 劣势:
查询性能不高,而且缺乏统一的查询语法4、图形(Graph)数据库(图) 相关数据库:Neo4J、InfoGrid、Infinite Graph 典型应用:社交网络。
数据模型:图结构 优势:利用图结构相关算法。 劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
Redis
什么是redis
c语言编写的键值非关系型数据库。主要用于高速访问的内容缓存,
redis也可以实现持久化,支持事务操作。
常用数据类型:
string(字符类型),
hash(散列类型),
list(列表类型),
set(集合类型),
sortedSet(有序集合)。
背景
2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便 对MySQL的性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo将Redis(BSD)开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis的开发,直到今天。
Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁网、知乎网,国外如GitHub、Stack Overflow、Flickr等都是Redis的用户。
VMware公司从2010年开始赞助Redis的开发, Salvatore Sanfilippo和Pieter Noordhuis也分别在3月和5月加入VMware,全职开发Redis。
Redis应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
安装redis
- 下载
- 安装
A. 准备: gcc环境
yum -y install gcc-c++
make命令:
yum -y install make
B. 下载解压
tar -zxvf redis-4.0.10.tar.gz -C /apps/
C. 切换到目录,编译
make:编译
清理: make distclean
D. 测试
make test(安装tcl)
E. 安装
make install(默认安装:/usr/local/bin)
make install PREFIX=apps/redis-5.0.5
F. 复制redis.conf到etc
cp redis.conf /etc/
G. 环境变量
export REDIS_HOME=apps/redis-5.0.5
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin:$REDIS_HOME/bin
source /etc/profile
Redis启动(服务器端+客户端)
A. 前端启动(服务器前端运行)
服务器: ./redis-server
关闭:
强制关闭:ctrl+c
正常命令: ./redis-cli shutdown(推荐)
客户端:./redis-cli
B. 后端启动
修改配置文件:
bind 192.168.2.111(修改绑定ip)
daemonize yes(修改作为后台守护程序运行)
运行服务器端:
./redis-server /etc/redis.conf
关闭服务器端:
**kill -9 **
./redis-cli shutdown(推荐)
自带客户端连接:
./redis-cli -h ip地址 -p 端口
图形客户端:
需要关闭防火墙
设置密码及模式
修改 vi redis.conf 配置文件
找到 # requirepass foobared
requirepass 123 #指定密码123
将 bind 127.0.0.1 #注释
找到 protected-mode yes 修改为 no
jedis客户端
Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。
Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis
- redis-cli
- 图形客户端: RedisDesktopManager
- jedis
A. 单实例连接
package jedistest;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
@Test
public void jedis() {
//1、创建对象
Jedis jedis = new Jedis("192.168.2.111",6379);
//2、设置密码
jedis.auth("123");
//3、操作
jedis.set("name","jasperlee");
System.out.println(jedis.get("name"));
//4、关闭
jedis.close();
}
}
B. jedis连接池
package jedistest;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class jedistpool {
@Test
public void pool() {
//1、创建redis池
JedisPool pool= new JedisPool("192.168.2.111", 6379);
//2、从池中获取连接
Jedis jedis = pool.getResource();
//3、设置密码
jedis.auth("123");
//4、操作
jedis.set("age", "27");
System.out.println(jedis.get("age"));
//5、归还连接池
jedis.close();
//6、关闭池
pool.close();
}
}
C. spring连接配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="false" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis单机 通过连接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="192.168.242.130" />
<constructor-arg name="port" value="6379" />
</bean>
</beans>
Redis数据类型
- String
1、 赋值: 语法:SET key value
127.0.0.1:6379> set name jasperlee
OK
2、 取值:语法:GET key
127.0.0.1:6379> get name
"jasperlee“
3、取值并赋值:语法:GETSET key value
127.0.0.1:6379> getset age 27
"27"
127.0.0.1:6379> get age
"27"
4、设置/获取多个键值:语法:MSET key value [key value …] MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2
1) "v1"
2) "v2"
5、删除:语法:DEL key
127.0.0.1:6379> del k3
(integer) 1
递增数字 :当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。
1、数值增减:语法:INCR key
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
2、 增加指定的整数:语法:INCRBY key increment
127.0.0.1:6379> incrby num 2
(integer) 4
127.0.0.1:6379> get num
"4"
127.0.0.1:6379> incrby num 10
(integer) 14
127.0.0.1:6379> get num
"14"
3、递减数值:语法:DECR key
127.0.0.1:6379> decr num
(integer) 13
127.0.0.1:6379> decr num
(integer) 12
4、减少指定的整数:语法:DECRBY key decrement
127.0.0.1:6379> decrby num 3
(integer) 9
127.0.0.1:6379> decrby num 4
(integer) 5
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。
5、 向尾部追加值: 语法:APPEND key value
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> APPEND str world
(integer) 10
127.0.0.1:6379> get str
"helloworld"
STRLEN命令返回键值的长度,如果键不存在则返回0。
6、获取字符串长度:语法:STRLEN key
> 127.0.0.1:6379> strlen str
(integer) 10
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> get str
"hello"
127.0.0.1:6379> strlen str
(integer) 5
应用: 自增主键 ,商品编号、订单号采用string的递增数字特性生成。
127.0.0.1:6379> incr id
(integer) 1
127.0.0.1:6379> incr id
(integer) 2
127.0.0.1:6379> incr id
(integer) 3
127.0.0.1:6379> incr id
(integer) 4
127.0.0.1:6379> incr id
(integer) 5
- Hash(散列类型)
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
一次只能设置一个字段值
1、赋值:语法:HSET key field value
127.0.0.1:6379> hset user username zhangsan
(integer) 1
2、 一次可以设置多个字段值
语法:HMSET key field value [field value …]
127.0.0.1:6379> hmset user username zs age 20
OK
当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作 语法:HSETNX key field value
127.0.0.1:6379> hsetnx user age 30 如果user中没有age字段则设置age值为30,否则不做任何操作 (integer) 0
1、取值:一次只能获取一个字段值,语法:HGET key field
127.0.0.1:6379> hget user username
"zhangsan“
2、 一次可以获取多个字段值 语法:HMGET key field [field …]
127.0.0.1:6379> hmget user username age
1) "zs"
2) "20"
3、获取所有字段值:语法:HGETALL key
127.0.0.1:6379> hgetall user
1) "username"
2) "zs"
3) "age"
4) "20"
4、删除字段:可以删除一个或多个字段,返回值是被删除的字段个数
语法:HDEL key field [field …]
127.0.0.1:6379> hdel user username
(integer) 1
127.0.0.1:6379> hdel user age username
(integer) 1
5、增加数字:语法:HINCRBY key field increment
127.0.0.1:6379> hincrby user age 2 将用户的年龄加2 (integer) 22
127.0.0.1:6379> hget user age 获取用户的年龄 "22“
6、判断字段是否存在:语法:HEXISTS key field
127.0.0.1:6379> hexists user age 查看user中是否有age字段
(integer) 1
127.0.0.1:6379> hexists user name 查看user中是否有name字段
(integer) 0
7、 只获取字段名或字段值:语法:HKEYS key,HVALS key
127.0.0.1:6379> hkeys user
1) "age"
2) "name"
127.0.0.1:6379> hvals user
1) "18"
2) "zs"
8、获取字段数量:语法:HLEN key
127.0.0.1:6379> hlen user
(integer) 2
应用: 存储商品信息 商品字段 【商品id、商品名称、商品描述、商品库存、商品好评】 定义商品信息的key 商品1001的信息在
Redis中的key为:[items:1001]
127.0.0.1:6379> hmset items:1001 id 3 name apple price 999.9
OK
127.0.0.1:6379> hget items:1001 id
"3"
127.0.0.1:6379> hgetall items:1001
1) "id"
2) "3"
3) "name"
4) "apple"
5) "price"
6) "999.9"
- List
Arraylist是使用数组来存储数据,特点:查询快、增删慢
Linkedlist是使用双向链表存储数据,特点:增删快、查询慢,但是查询链表两端的数据也很快。
Redis的list是采用来链表来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作的。
向列表两端增加元素
1、向列表左边增加元素 :语法:LPUSH key value [value …]
127.0.0.1:6379> LPUSH list1 1 2 3
(integer) 3
2、向列表右边增加元素 :语法:RPUSH key value [value …]
127.0.0.1:6379> RPUSH list1 a b c
(integer) 6
查看列表 LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。
查看列表:语法:LRANGE key start stop
127.0.0.1:6379> lrange list1 0 2
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "2"
3) "1"
4) "a"
5) "b"
6) "c"
从列表两端弹出元素
LPOP命令从列表左边弹出一个元素,会分两步完成:
第一步是将列表左边的元素从列表中移除
第二步是返回被移除的元素值。
语法:
LPOP key
RPOP key
127.0.0.1:6379> LPOP list1
"3"
127.0.0.1:6379> RPOP list1
"c"
1、获取列表中元素的个数:语法:LLEN key
127.0.0.1:6379> LLEN list1
(integer) 5
2、 删除列表中指定的值:语法:LREM key count value
LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:
当count>0时, LREM会从列表左边开始删除。
127.0.0.1:6379> LREM list2 2 2
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "b"
2) "1"
3) "a"
4) "b"
5) "c"
6) "3"
7) "2"
8) "a"
9) "c"
10) "3"
11) "b"
12) "a"
13) "2"
14) "1"
当count<0时, LREM会从列表后边开始删除。
127.0.0.1:6379> LREM list2 -2 a
(integer) 2
127.0.0.1:6379> lrange list2 0 -1
1) "b"
2) "1"
3) "a"
4) "b"
5) "c"
6) "3"
7) "2"
8) "c"
9) "3"
10) "b"
11) "2"
12) "1"
当count=0时, LREM删除所有值为value的元素。
127.0.0.1:6379> LREM list2 0 b
(integer) 3
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "c"
4) "3"
5) "2"
6) "c"
7) "3"
8) "2"
9) "1"
3、获得/设置指定索引的元素值:获得指定索引的元素值:语法:LINDEX key index
127.0.0.1:6379> LINDEX list2 2
"c"
4、设置指定索引的元素值 语法:LSET key index value
127.0.0.1:6379> LSET list2 2 3
OK
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "3"
4) "3"
5) "2"
6) "c"
7) "3"
8) "2"
9) "1"
5、只保留列表指定片段
指定范围和LRANGE一致 :语法:LTRIM key start stop
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "3"
4) "3"
5) "2"
6) "c"
7) "3"
8) "2"
9) "1"
127.0.0.1:6379> LTRIM list2 0 3
OK
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "3"
4) "3"
6、向列表中插入元素
该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
语法:LINSERT key BEFORE|AFTER pivot value
127.0.0.1:6379> LINSERT list2 before 3 5
(integer) 5
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "5"
4) "3"
5) "3"
127.0.0.1:6379> LINSERT list2 after 3 4
(integer) 6
127.0.0.1:6379> lrange list2 0 -1
1) "1"
2) "a"
3) "5"
4) "3"
5) "4"
6) "3"
7、将元素从一个列表转移到另一个列表中
语法:RPOPLPUSH source destination
127.0.0.1:6379> RPOPLPUSH list2 list1
"3"
127.0.0.1:6379> lrange list1 0 -1
1) "3"
2) "3"
3) "2"
4) "1"
5) "a"
应用
商品评论列表,在Redis中创建商品评论列表,用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。
定义商品评论列表key: 商品编号为1001的商品评论key【items: comment:1001】
127.0.0.1:6379> LPUSH items:comment:1001 '{"id":1,"name":"商品不错,很好!!","date":1430295077289}'
(integer) 1
- Set(集合类型)
集合类型:无序、不可重复。
列表类型:有序、可重复。1、增加元素:语法:SADD key member [member …]
127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0
2、 删除元素:语法:SREM key member [member …]
127.0.0.1:6379> srem set c d
(integer) 1
3、获得集合中的所有元素:语法:SMEMBERS key
127.0.0.1:6379> smembers set
1) "a"
2) "b"
4、判断元素是否在集合中:语法:SISMEMBER key member
127.0.0.1:6379> sismember set a
(integer) 1 # 返回1表示存在
127.0.0.1:6379> sismember set e
(integer) 0 # 返回0表示不存在
运算命令
1、集合的差集运算:属于A并且不属于B的元素构成的集合
语法:SDIFF key [key …]
127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB
1) "1"
127.0.0.1:6379> sdiff setB setA
1) "4"
2、集合的交集运算:属于A且属于B的元素构成的集合。
语法:SINTER key [key …]
127.0.0.1:6379> sinter setA setB
1) "2"
2) "3"
3、集合的并集运算:属于A或者属于B的元素构成的集合 语法:SUNION key [key …]
127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"
4、获得集合中元素的个数:语法:SCARD key
127.0.0.1:6379> scard setA
(integer) 3
从集合中弹出一个元素:语法:SPOP key 注意:由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出
127.0.0.1:6379> SPOP setA
"3"
- Sortedset
Sortedset又叫zset
Sortedset是有序集合,可排序的,但是唯一。
Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。
1、 增加元素:向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
语法:ZADD key score member [score member …]
127.0.0.1:6379> zadd score 80 zhangsan 89 lisi 94 wangwu
(integer) 3
127.0.0.1:6379> zadd score 97 lisi
(integer) 0
2、获取元素的分数:语法:ZSCORE key member
127.0.0.1:6379> zscore score lisi
"97"
3、删除元素:移除有序集key中的一个或多个成员,不存在的成员将被忽略。 当key存在但不是有序集类型时,返回一个错误。 语法:ZREM key
member [member …]
127.0.0.1:6379> zrem score lisi
(integer) 1
4、 获得排名在某个范围的元素列表:获得排名在某个范围的元素列表,按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。 语法:ZRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrange score 0 2
1) "zhangsan"
2) "wangwu"
5、按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
语法:ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379> ZREVRANGE score 0 2
1) "wangwu"
2) "zhangsan"
6、如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数
127.0.0.1:6379> ZRANGE score 0 1 withscores
1) "zhangsan"
2) "80"
3) "wangwu"
4) "94"
7、 获取元素的排名, 从小到大语法:ZRANK key member
127.0.0.1:6379> ZRANk score zhangsan
(integer) 0
8、从大到小,语法:ZREVRANK key member
127.0.0.1:6379> ZREVRANK score zhangsan
(integer) 1
9、获得指定分数范围的元素
语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> ZRANGEBYSCORE score 90 100 WITHSCORES
1) "wangwu"
2) "94"
127.0.0.1:6379> ZRANGEBYSCORE score 70 100 limit 1 2
1) "wangwu"``
10、增加某个元素的分数:返回值是更改后的分数
语法:ZINCRBY key increment member
127.0.0.1:6379> ZINCRBY score 100 lisi
"104"
11、获得集合中元素的数量:语法:ZCARD key
127.0.0.1:6379> ZCARD score
(integer) 3
12、获得指定分数范围内的元素个数
127.0.0.1:6379> ZCOUNT score 80 100
(integer) 2
13、按照排名范围删除元素:语法:ZREMRANGEBYRANK key start stop
127.0.0.1:6379> ZREMRANGEBYRANK score 0 1
(integer) 2
127.0.0.1:6379> ZRANGE score 0 -1
1) "lisi"
14、按照分数范围删除元素:语法:ZREMRANGEBYSCORE key min max
127.0.0.1:6379> ZADD score 111 zhaoliu
(integer) 1
127.0.0.1:6379> ZREMRANGEBYSCORE score 80 120
(integer) 1
应用:商品销售排行榜
需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。
1、写入商品销售量:商品编号1001的销量是9,商品编号1002的销量是10
127.0.0.1:6379> ZADD items:sellsort 9 1001 10 1002
(integer) 2
2、商品编号1001的销量加1:
127.0.0.1:6379> ZINCRBY items:sellsort 1 1001
"10"
3、商品销量前10名:
127.0.0.1:6379> ZRANGE items:sellsort 0 9 withscores
1) "1001"
2) "10"
3) "1002"
4) "10"
keys命令
1、返回满足给定pattern 的所有key
127.0.0.1:6379> keys list
1) "list"
2、exists:确认一个key 是否存在, 示例:从结果来看,数据库中不存在jasperlee 这个key,但是age 这个key是存在的
127.0.0.1:6379> exists jasperlee
(integer) 0
127.0.0.1:6379> exists age
(integer) 1
3、del:删除一个key
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> exists age
(integer) 0
4、rename:重命名key
示例:age 成功的被我们改名为age_new 了
127.0.0.1:6379> keys *
1) "setB"
2) "id"
3) "list1"
4) "num"
5) "score"
6) "country"
7) "items:sellsort"
8) "k2"
9) "list"
10) "items:comment:1001"
11) "k1"
12) "str"
13) "address"
14) "setA"
15) "name"
16) "adress"
17) "user"
18) "items:1001"
19) "set"
20) "county"
21) "item:id"
127.0.0.1:6379> rename user users
OK
1) "setB"
2) "id"
3) "list1"
4) "num"
5) "score"
6) "country"
7) "items:sellsort"
8) "k2"
9) "list"
10) "items:comment:1001"
11) "k1"
12) "str"
13) "address"
14) "setA"
15) "name"
16) "adress"
17) "users"
18) "items:1001"
19) "set"
20) "county"
21) "item:id"
5、type:返回值的类型
示例:这个方法可以非常简单的判断出值的类型
127.0.0.1:6379> type list1
list
127.0.0.1:6379> type name
string
127.0.0.1:6379> type set
set
6、设置key的生存时间
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。
EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
TTL key 查看key生于的生存时间
PERSIST key 清除生存时间
PEXPIRE key milliseconds 生存时间设置单位为:毫秒
127.0.0.1:6379> set firstname jasper 设置firstname 的值为jasper
OK
127.0.0.1:6379> get firstname 获取firstname 的值
"jasper"
127.0.0.1:6379> EXPIRE firstname 20 设置firstname的生存时间为20秒
(integer) 1
127.0.0.1:6379> TTL firstname 查看firstname的生于生成时间还有14秒删除
(integer) 14
127.0.0.1:6379> TTL firstname
(integer) -2
127.0.0.1:6379> get firstname 获取firstname 的值,已经删除
(nil)