|
关系型数据库:
优点:
[list,
[*,数据可以永久保存在磁盘上,不受断电影响,数据相对安全
[*,支持多表查询
[*,支持事务管理
[/list,缺点:
[list,
[*,受限制IO速度,读写相对较慢
[*,受约束、检车、事务等限制读写速度相对较慢
[/list,非关系型数据库(这里只redis) 优点:
[list,
[*,存储介质是内存,速度很快
[*,断电内存中的数据库会抹掉,数据相对不安全
[*,不支持多表查询
[*,事物的支持较差
[/list,项目中两种类型的数据库都会使用,Redis用于修改频率低,查询频率高的场景。先访问NOSql, 如果NOsql中没有数据,再会访问mysql的数据库并将查询结果写入到NOSql中,通常都会先访问NOSql中的数据。
开发中通常使用微软开发的windows版本的redis,在生产环境中使用redis官方的Linux版本Redis。
windows版本:适合开发学习,http://github.com/MSOpenTech/redis/tags ,由微软提供
linux版本:适合正式环境,官方提供的http://redis.io/download
本文只介绍windows版本的使用
服务器启动后会根据电脑内存相等的大小大小占用磁盘空间
无法打开服务器端
原因:redis服务器启动会占用当前磁盘系统内存相等大小的空间, 如电脑内存16G, 启动时就会占磁盘16G的空间, 如果当前磁盘不够16G, 服务器就不能启动起来。
redis有五种数据类型,string、hash、List、set、zset。
string
字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中以二进制保存,没有编码和解码的过程。无论存入的是字符串、整数、浮点类型都会以字符串写入。在 Redis 中字符串类型的 VALUE 最多可以容纳的数据长度是 512M。string也是最常用的数据类型。
hash
Redis 中的 Hash 类型可以看成具 String 的键和 String 的值 Map 容器,每一个 Hash 可以存储 40(42 亿 9千多个)亿个键值对。
string类型存储的value大小限制512MB
hlen:获取hash类型指定key的field数
[indent,语法: hlen key
[/indent,HEXISTS:判断hash中指定key的指定字段是否存在
[indent,语法: HEXISTS key field1
[/indent,Hincrby:命令用于为哈希表中的字段值加上指定增量值。
在 Redis 中,List 类型是按照插入顺序排序的字符串链表。和数据结构中的双向普通链表(java的LinkedList)一样,可以在其左部(left)和右部(right)添加新的元素。在插入时,如果该键并不存在,Redis 将为该键创建一个新的链表,如果这个键已经存在,则是向 list 添加元素。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List 中可以包含的最大元素数量是 40 亿个。可以实现队列(先进先出)和栈(先进后出)
添加元素
查询元素
删除元素语法
查看列表的长度
lindex key 位置
lset key 位置 元素新值
规则:从左到右匹配第一个符合的元素插入
LINSERT key BEFORE或AFTER 已有元素值 新元素值
LREM KEY 数量 元素值
规则:
[list,
[*,count > 0 : 从表头开始向表尾搜索(左到右),移除与 VALUE 相等的元素,数量为 COUNT 。
[*,count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
[*,count = 0 : 移除表中所有与 VALUE 相等的值。-
[/list,
在 Redis 中,可以将 Set 类型看作为没有排序的字符集合,和 List 类型一样,可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。Set 可包含的最大元素数量是 40 亿,与 List 类型不同的是,Set 集合中不可以出现重复的元素。
sadd 键 元素 元素 ===>向set集合中添加1个或多个元素
smembers 键 ===>查询指定的集合中所有元素
sismember 键 元素===>判断指定的元素是否在某个集合中,如果存在返回1,否则返回0
srem 键 元素 元素 ===>删除set中指定的一个或多个元素
set没有修改数据命令
sorted set 是有序(自然顺序)并且不可重复(value值不可以重复)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的元素。
不同的是每个元素会有一个分数值。redis可以通过分数的大小来为集合中的元素进行从小到大的排序。有序集合的元素是唯一的,但分数(score)是可以重复的,每个集合可存储40多亿个成元素。
zrange 键 0 -1 withscores 升序查询指定索引范围的数据,并显示值的分数
zrevrange 键 0 -1 withscores 降序查询指定索引范围的数据,并显示值的分数
zrevrank 键 值 降序查询指定元素的索引
zset没有修改数据命令
keys 匹配字符 功能:
[list,
[*,查询数据库中有哪些符合匹配规则的键
[*,*匹配多个字符 keys *查询所有键
[*,?匹配一个字符
[/list,del 键1 键2 功能: 可以删除任意的键,一次可删除多个键
exists 键 功能: 是否存在指定的键
type 键 功能: 判断指定的键是什么类型
select 数据库编号 功能: 选择指定的数据库(有16个数据库,默认使用0,这里的值的范围是0-15)
move 键 数据库编号 功能: 将某个键移动到另一个数据库中,如果另一个数据库中有同名的键,则移动失败
Expire 键 秒 功能: 用于设置key的过期时间,key过期后不能再使用,单位是秒
setnx key value 功能 将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX不做任何动作。SETNX是『SET if Not eXists』(如果不存在,则 SET)的简写。
TTL 键 功能: 以秒为单位,返回给定key的剩余生存时间
redis服务器关闭所有内存数据都会全部丢失吗? 答: 不会全部丢失, 只会丢失部分数据 原因: redis有持久化机制, 可以在符合条件的时候将内存中的数据持久化到磁盘上保存; 当服务器再次启动会自动恢复数据
为什么要保存到磁盘? 答: 防止redis服务器突然崩溃, redis可以重启之后立刻恢复磁盘的数据用于缓存; 这就是redis的持久化机制 如果没有redis持久化机制, 所有缓存数据丢失, 会造成磁盘数据库mysql瞬间压力增大, 有可能导致mysql崩溃
Redis DataBase(RDB) , 是redis的默认开启的持久化策略. 在符合持久化条件时会将这一时刻内存所有数据进行持久化到磁盘文件上dump.rdb, 由于持久化的是某一时刻所有内存数据又叫快照策略.
RDB策略的配置在配置文件redis.windows.conf文件中有配置的持久化条件
save 900 1 如果有1个以上的key发生改变(增删改)] 那么900秒(15分钟)持久化一次数据到dump.rdb文件中
save 300 10 如果有10个以上的key发生改变(增删改)] 那么300秒(5分钟)持久化一次数据到dump.rdb文件中
save 60 10000 如果有10000个以上的key发生改变(增删改)] 那么60秒(1分钟)持久化一次数据到dump.rdb文件中
双击启动redis-server.exe是不会使用配置文件中的配置的,如果使用配置在启动的时候需要将配置文件作为参数才能使用配置
redis-server.exe redis.windows.conf
AOF策略是每一秒将一秒内的增删改的命令持久化追加到appendonly.aof文件中,默认不开启此策略。
需要修改配置文件redis.windows.conf进行开启AOF策略,如下操作
AOF的三种策略
appendfsync always 每次修改都持久化,这样磁盘IO就成为了读写速度的瓶颈,效率最低
appendfsync everysec 每秒钟持久化一次
appendfsync no 不持久化,效率最高
JedisJedis的方法与redis命令完全一致
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!--junit支持包 不使用junit可以不导入此包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> package cong.zone.test; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.util.List; public class JedisTest { @Test public void test01{ //1. 创建jedis连接池的配置对象 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig; //1.1 设置连接池最大的连接个数 jedisPoolConfig.setMaxTotal(10); //1.2 设置获取连接最大的等待时间 jedisPoolConfig.setMaxWaitMillis(10000); //单位毫秒 30秒 //2. 创建jedis连接池 JedisPool jedisPool = new JedisPool(jedisPoolConfig,"localhost"]6379); //3. 获取到jedis Jedis jedis = jedisPool.getResource; //4. 操作(jedis的api与redis的命令方法是一样的) jedis.set("name"]"张三"); //操作字符串类型 String name = jedis.get("name"); System.out.println("获取到的数据:"+ name); //操作list jedis.rpush("list"]"张三"]"李四"]"王五"); List<String> list = jedis.lrange("list"] 0] -1); System.out.println("list集合的数据:"+ list); //5. 关闭jedis jedis.close; } } |
|