2Redis

#一、NoSQL

1.什么是nosql

​ NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。适合存储不经常改变的从mysql中获取的数据,经常使用又不经常改变的数据存储在缓存数据库中

2.为什么需要nosql

​ High performance - 对数据库高并发读写的需求

Huge Storage - 对海量数据的**高效率存储和访问**的需求 

​ High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求

3.nosql的特点

​ 1.易扩展

​ 2.大数据量,高性能

​ 3.灵活的数据模型

​ 4.高可用

4.nosql支持的数据类型

1.字符串类型 string(常用:json/xml)

2.散列类型 hash(key value key–value(map) )

3.列表类型 list linkedlist 用户列表

4.集合类型 set

5.有序集合类型 sortedset

5.Redis目录

目录或文件 作用
redis-benchmark 性能测试工具
redis-check-aof AOF文件修复工具
redis-check-dump RDB文件检查工具(快照持久化文件)
redis-cli 命令行客户端
redis-server redis服务器启动命令
redis.windows.conf redis核心配置文件

Windows下安装6379(nosql)服务

redis-server –service-install redis.windows.conf–loglevel verbose

#二、Redis的5种数据类型

1.字符串类型 string(常用:json/xml)

2.散列类型 hash(key value key–value(map) )

3.列表类型 list linkedlist 用户列表

4.集合类型 set

5.有序集合类型 sortedset

​ 在日常开发中主要使用比较多的有字符串、哈希、字符串列表、字符串集合四种类型,其中最为常用的是字符串类型。

1.关于key的定义,注意如下几点:

​ 1.key不要太长,最好不要超过1024个字节,这不仅会消耗内存还会降低查找效率.

​ 2.key不要太短,如果太短会降低key的可读性

​ 3.在项目中,key最好有一个统一的命名规范

2.字符串类型String

​ 1.字符串类型是在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

​ 2.Redis中最为基础的数据存储类型,字符串在Redis中是二进制保存,因此是安全的,这便意味着该类型存入和获取的数据相同。

##3.常用命令

​ (1)设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”

​ #设置key-value

set company “qiezicy”

​ 获取value

get company

​ 删除 key

del company

​ (2)当存储的key对应的值是一个整数时,让当前的key对应的值进行递增。并返回递增后的值。

INCR key:给key的值递增1

INCRBY key increment:给key的值增加指定的整数(increment)

DECR key:给key的值递减1

DECRBY key decrement:给key的值递减指定的整数(decrement)

用途:数据存储于一个库的一张表可以达到id的自增长,但当数据量非常庞大,不得不存储于多个表甚至于多个库时,如果使用数据库的id自增长就存在问题,多个表或者多个库中的不同数据的id会重复,因为每个表的id都是从1自增长的。这就需要借助于其他手段或者机制来实现,比如:借助于redis的INCR自增长的机制,维护共同的id

​ (3)APPEND

​ 1) 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。

​ 2) 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

语法:APPEND key value

返回值:追加指定值之后, key 中字符串的长度。

​ (4) STRLEN

​ Strlen 命令用于获取指定 key 所储存的字符串值的长度。

语法:STRLEN key

返回值:追加指定值之后, key 中字符串的长度。

​ (5)MGET MSET

​ Mset命令用于同时设置一个或多个 k-v对

语法:MSET key1 value1 key2 value2 … keyN valueN

​ Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。

语法:MGET KEY1 KEY2 .. KEYN

3.哈希类型hash

1531535474245

1
2
Key是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 
也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

使用场景:

​ 存储部分变更数据,如用户信息等

语法:

1.为指定的key设定field/value对(键值对)

​ hset key field value———>>hset myhash username haha

2.返回指定的key中的field的值

​ hget key field—————–>>hget myhash username

3.可以删除一个或多个字段,返回值是被删除的字段个数

​ hdel key field /field…———>>hdel myhash username

4. HGETALL、HKEYS、HVALS 批量查询

#HGETALL获取在哈希表中指定 key 的所有字段和值

语法HGETALL key

返回值:

​ 以列表形式返回哈希表的域和域的值。若 key 不存在,返回空列表。在返回值里,紧跟每个域名(field name)之后是域的值(value)

#HKEYS获取所有哈希表中的字段

语法:HKEYS key

返回值:

​ 一个包含哈希表中所有字段的表。当 key 不存在时,返回一个空表。

#HVALS获取哈希表中所有值

语法:HVALS key

返回值:

​ 一个包含哈希表中所有域(field)值的列表。 当 key 不存在时,返回一个空表

5. HMSET、HMGET(批量新增)

语法HMSET key field1 value1 [field2 value2 ]

​ 同时将多个 field-value (域-值)对设置到哈希表 key 中。此命令会覆盖哈希表中已存在的字段。

返回值:如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时,返回一个错误。

>hmset myhash qq 10001 email 10001@qq.com  address china

语法:HMGET key field [field ...]

​ 获取所有给定字段的值

返回值:

​ 一个包含多个给定域的关联值的表,表值的排列顺序和给定域参数的请求顺序一样。

>hmget myhash username qq email

4.列表类型list

应用场景:

1
2
3
4
5
Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。

List 就是链表,使用List结构,我们可以轻松地实现最新消息排行等功能。List的另一个应用就是消息队列,

可以利用List的PUSH操作,将任务存在List中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删除List中某一段的元素。

img

​ 1,在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。

​ 2,在插入时,如果该键不存在,Redis将为该键创建一个新的链表。

​ 3,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。

​ 4,List中可以包含的最大元素数量是4294967295

  1. lpush key value1 value2 …

在指定的key所关联的list的头部插入所有的values

如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。

插入成功,返回元素的个数。

  1. rpush key value value value

在指定的key对应的list的尾部插入所有的value,

如果该key不存在,该命令在插入之前创建一个与该key对应的空链表,再从尾部插入数据。

  1. lpop key

先进后出,弹出第一个元素

返回并弹出指定的key关联的链表中的第一个元素,即头部元素。

如果该key不存在,返回nil;

若key存在,则返回链表的头部元素。

  1. rpop key

从尾部弹出元素。

5.集合类型set

应用场景:

1
2
3
4
Redis set对外提供的功能与list类似是一个列表的功能,
特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,
set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,
这个也是list所不能提供的。

简单介绍:

1
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295,和List类型不同的是,Set集合中不允许出现重复的元素。

常用命令

  1. sadd key values[value1****value2…]

向set中添加数据,如果该key的值已有则不会重复添加

sadd myset 1 2 4

  1. srem key members[member1、member2…]

获取set中所有的成员

  1. srem key members[member1、member2…]

删除set中指定的成员

6小结

字符串 set get del json格式字符串
hash hset hget hgetall hmset
list lpush rpush lpop rpop
sadd smemebers srem

#三、Redis的通用命令

1.keys pattern

示例:keys * (查询所有的键)

符号 含义
? 匹配一个字符
* 匹配任意个(包括0个) 字符
[] 匹配括号间任一字符,可以使用”-“表示范围,如果a[a-d]可以匹配“ab”,“ac”,”ad”
\x 匹配字符x,用于转义符号,如果要匹配“?”就需要使用\?

获取所有与pattern匹配的key,返回所有与该key匹配的keys。*表示任意一个或多个字符,?表示任意一个字符

2.del key1 key2…

删除指定的key

3.exists key

判断该key是否存在,1代表存在,0代表不存在

4.type key

​ 获取指定key的类型。该命令将以字符串的格式返回。 返回的字符串为string、list、set、hash,如果key不存在返回none

#四、Jedis的基本使用

1.jedis介绍

​ 在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。

2.jedis常用API及Jar包

方法 解释
new Jedis(host, port) 创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口
set(key value) 设置字符串类型的数据
get(key) 获得字符串类型的数据
hset(key, field, value) 设置哈希类型的数据
hget(key, field) 获得哈希类型的数据
lpush(key, values) 设置列表类型的数据
lpop(key) 列表左面弹栈
rpop(key) 列表右面弹栈
del(key) 删除指定的key

commons-pool2-2.3.jar

jedis-2.7.0.jar

3.jedis连接池的使用

jedis连接资源的创建与销毁是很消耗程序性能,所以jedis为我们提供了jedis的池化技术**

‘#基本使用

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
public static void main(String[] args) {
//1 获得连接池配置对象,设置配置项
JedisPoolConfig config = new JedisPoolConfig();
// 1.1 最大连接数
config.setMaxTotal(30);
// 1.2 最大空闲连接数
config.setMaxIdle(10);
//2 获得连接池
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
//3 获得核心对象
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
//4 设置数据
jedis.set("name", "qiezicy");
//5 获得数据
String name = jedis.get("name");
System.out.println(name);
} catch (Exception e) {
e.printStackTrace();
} finally{
if(jedis != null){
jedis.close();
}
// 虚拟机关闭时,释放pool资源
if(jedisPool != null){
jedisPool.close();
}
}

4.JedisUtils工具类

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
package com.qiezi.jedisPool;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.util.ResourceBundle;

/**
* Created by IntelliJ IDEA
*
* @author Eric.Shen
* @date 2018/8/19
* @time 14:09
*/
public final class JedisUtil {
public JedisUtil() {
}

/**
* 连接池对象
*/
private static JedisPool jedisPool;
/**
* 最大连接数
*/
private static int maxtotal;
/**
*最大等待时间
*/
private static int maxwaitmillis;
/**
* 主机地址
*/
private static String host;
/**
* 端口:默认6379
*/
private static int port;

/**
* 读取jedis.properties配置文件
*/
static {
ResourceBundle rb = ResourceBundle.getBundle("jedis");
maxtotal = Integer.parseInt(rb.getString("maxtotal"));
maxwaitmillis = Integer.parseInt(rb.getString("maxwaitmillis"));
host = rb.getString("host");
port = Integer.parseInt(rb.getString("port"));
}

/**
* 创建连接池
*/
static {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxtotal);
jedisPoolConfig.setMaxWaitMillis(maxwaitmillis);
jedisPool = new JedisPool(jedisPoolConfig, host, port);
}

/**
* 获取Jedis
* @return
*/
public static Jedis getJedis() {
return jedisPool.getResource();
}

/**
* 关闭Jedis
* @param jedis
*/
public static void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}

jedis.properties(src目录下配置文件,编写配置文件)

1
2
3
4
maxtotal=100
maxwaitmillis=3000
host=127.0.0.1
port=6379

Powered by Hexo and Hexo-theme-hiker

Copyright © 2016 - 2018 Francis的个人博客 All Rights Reserved.

UV : | PV :