#一、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
1 | Key是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为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 | Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。 |
1,在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。
2,在插入时,如果该键不存在,Redis将为该键创建一个新的链表。
3,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。
4,List中可以包含的最大元素数量是4294967295
- lpush key value1 value2 …
在指定的key所关联的list的头部插入所有的values,
如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。
插入成功,返回元素的个数。
- rpush key value value value
在指定的key对应的list的尾部插入所有的value,
如果该key不存在,该命令在插入之前创建一个与该key对应的空链表,再从尾部插入数据。
- lpop key
先进后出,弹出第一个元素
返回并弹出指定的key关联的链表中的第一个元素,即头部元素。
如果该key不存在,返回nil;
若key存在,则返回链表的头部元素。
- rpop key
从尾部弹出元素。
5.集合类型set
应用场景:
1 | Redis set对外提供的功能与list类似是一个列表的功能, |
简单介绍:
1 | 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295,和List类型不同的是,Set集合中不允许出现重复的元素。 |
常用命令
- sadd key values[value1**、**value2…]
向set中添加数据,如果该key的值已有则不会重复添加
sadd myset 1 2 4
- srem key members[member1、member2…]
获取set中所有的成员
- 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 | public static void main(String[] args) { |
4.JedisUtils工具类
1 | package com.qiezi.jedisPool; |
jedis.properties(src目录下配置文件,编写配置文件)
1 | maxtotal=100 |