Redis基础入门
学习redis之前,要了解NoSQL。。
一、NoSql概述
由于关系型数据库很难实现:
1.高并发读写
2.海量数据的高校率存储和访问
3.高可扩展性和高可用性
所以出现NoSql,(Not Only SQL)非关系型数据库,是不同于传统的关系型数据库的一种全新数据库管理系统的统称,用于超大规模数据的存储(例如朋友圈每秒可能有上万条数据的读写),这些数据存储不需要固定格式,并且可以横向扩展。
NoSql的产品:mongoDB、Redis、CouchDB等
NoSql数据库的四大分类:
- 键值对(Key-Value)存储:比如Redis,优点是快速查询,缺点是存储的数据缺少结构化
- 列存储:比如HBase,优点是快速查询,可扩展性强,缺点是功能相对于局限
- 文档数据库:比如mongoDB,优点是数据结构要求不高,缺点是查询性能不高,而且缺少统一的查询语法
- 图形数据库:比如InfoGrid(应用于社交网络),优点是利用图结构算法,缺点对整个图进行计算才能得出结果,不容易做分布式的集群方案
4类NoSql优缺点比较
表格来源:https://blog.csdn.net/oleichang/article/details/48626471
NoSql特点:
- 易扩展(去掉关系,可扩展)
- 灵活的数据模型(不需要建立各种字段)
- 大数据量,高性能的存储(非常高的读写性能)
- 高可用(不太影响性能的情况下,使用高可用框架)
NoSql应用:大型Web网站
二、Redis概述
C语言开发开源的高性能的键值对数据库,通过提供多种键值数据类型来适应不同场景下的需求,目前支持的数据类型有:字符串类型、散列类型、列表类型、有序集合类型、集合类型。新浪、知乎、github都在使用redis数据库。
应用场景:
- 缓存:数据查询、新闻、商品信息这些我们经常放入缓存当中;
- 在线好友的列表
- 任务队列:秒杀、抢购;
- 网站访问统计
- 数据过期处理
- 应用排行榜
- 分布式集群架构中的session分离
Redis的安装:
具体安装方式可参考:http://www.runoob.com/redis/redis-install.html,超详细安装教程。
安装完毕,打开Redis服务(windows):
- 在redis的解压根目录下打开cmd窗口,输入redis-server.exe redis.windows.conf,显示如下,说明启动成功
- 再打开一个cmd窗口进入Redis解压根目录,输入redis-cli.exe -h 127.0.0.1 -p 6379
Jedis介绍:
Jedis是Redis官方首选的Java客户端开发包
Jedis源码下载地址:https://github.com/xetorthio/jedis(没有jar的下载地方)
Jedis.jar下载地址:http://mvnrepository.com/artifact/redis.clients/jedis
commons-pool2.jar下载地址:http://mvnrepository.com/artifact/org.apache.commons/commons-pool2
下面是Java对Redis的读写代码:
1.单实例连接
@Test
/**
* 单实例的测试
*/
public void demo1(){
//1.设置ip 端口号
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2.存入键值对
jedis.set("name", "zhuwei");
//3.取得键值对
String value = jedis.get("name");
System.out.println(value);
//4.释放资源
jedis.close();
}
// 输出结果:zhuwei
2.连接池连接
/**
* 连接池方式连接
*/
public void demo2(){
// 获得连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 设置连接池最大连接数
config.setMaxTotal(10);
// 设置最大空闲连接数
config.setMaxTotal(5); // 获得连接池
JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379); // 获得连接
Jedis jedis = null;
try {
// 通过连接池获得连接
jedis = jedisPool.getResource();
// 设置数据
jedis.set("name", "jinzf");
// 获得数据
String value = jedis.get("name");
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放连接
jedis.close();
// 释放连接池
jedisPool.close();
}
//输出结果:jinzf
Redis的数据结构:
key定义注意事项:
- 不要过长
- 不要过短
- 最好有统一的命名规范
1.存储String
- 以二进制存储,存入和获取的数据相同
- value最大长度512M
- 常用命令
- set key value --存入
- get key --获取
- del key --删除
- incr key --整数增长1,如果key不存在,默认值是0
- decr key --整数递减1,如果key不存在,默认值是0
- incrby key n --整数key增长n,默认值是0
- decrby key n --整数key递减n,默认值是0
- append key n --字符串key后面拼接n,如果key不存在,会创建key,值是n
2.存储Hash
- String key和String value的map容器,非常适合存储值、对象的信息
- 每一个Hash可以存储4294967295个键值对
- 常用命令
- hset key (key value) --存入 eg:hset mykey username zhuwei(存入一个key为mykey的map,value是username zhuwei)
- hmset key (key1 value1 key2 value2...) --存入对个键值对
- hget key value-key --获取key中map的key为value-key的值
- hmget key value-key1 value-key2 --获取key中map的key为value-key1和value-key2的值
- hgetall key --获得全部键值对
- hdel key value-key1 value-key2 --删除多个map
- del key --删除key的整个Hash
- hincrby key value-key n --key中的value-key增长n
- hexists key value-key --key中是否存在value-key,1:存在 0:不存在
- hlen key --获取key整个Hash的属性长度
- hkeys key --获取key整个Hash的全部value-key
- hvalues key --获取key整个Hash的全部value-value值
3.存储List
- ArrayList使用数组方式存储数据,根据下标查找数据速度快,但是插入元素涉及到元素的位移,速度变慢
- LinkedList使用双向连接方式存储数据,插入元素只改变前后元素的指针指向,所以速度快,查找元素涉及到遍历整个链表,速度变慢
- 双向链表中增加数据
- 双向链表删除数据
- 常用命令
- lpush key n1 n2 n3 --左侧添加元素,存放之后顺序为:n3 n2 n1
- rpush key n1 n2 n3 --右侧添加元素,存放之后顺序为:n1 n2 n3
- lrange key 0 n --取出下标为0-n的元素,0 -1 :显示全部元素 0 -2 显示到倒数第二个元素
- lpop key --从左侧弹出
- rpop --从右侧弹出
- llen key --输出长度
- lpushx key x --在头部添加x元素,如果key不存在,不会存入x
- lrem key n m --从头删除n个m
- lrem key -n m --从后删除n个m
- lset key n x --在第n个角标处添加x元素
- linsert key before n x --在第一个n之前插入x
- linsert key after n x --在第一个n之后插入x
- rpoplpush key1 key2 --取出key1的最后一个元素,插入到key2的第一个元素处
- rpoplpush常应用于消息队列,来完成多个程序之间的消息交互
4.存储set
- 没有排序的字符集合,不允许出现重复的元素
- 包含的最大元素个数是4294967295
- 常用命令
- sadd key a b c --添加元素
- srem key n -- 删除key中n元素
- smenbers key --输出key中元素
- sismember key n --判断key中是否含有元素n
- sdiff key1 key2 --求key1 key2的差集运算
- sinter key1 key2 --求key1 key2的交集运算
- sunion key1 key2 --求key1 key2的并集运算
- scard key -- 输出key的元素个数
- srandmenber key--随机返回key中的一个元素
- sdiffstore key key1 key2 --将key1和key2的差集存到key中
- sinterstore key key1 key2 --将key1和key2的交集存到key中
- sunion key key1 key2 --将key1和key2的并集存到key中
- set的应用场景:
- 记录唯一性的数据(访问博客的某一Ip,保证ip的唯一性)
- 维护数据对象之间的关联关系(买了某一商品的人存入一个set中,买了另一种商品的人存入另一个set中,求同时购买了两种商品的人,set之间做交集即可)
5.存储sorted-set
- sorted-set和set都是字符串的集合,都不允许有重复的成员
- sorted-set没有key中的成员都有一个分数与之关联
- 成员在集合中的位置是有序的,分数可以重复
- 删除、添加、更新成员都是很快的
- 主要应用场景:游戏的积分排行、微博的热门话题、构建索引数据
- 常用命令
- zadd key score1 n score2 m... --添加元素n的分数是score1,m的分数是score2,分数重复会替换掉原来的分数
- zscore key n --获得key中n的分数
- zrem key n --删除key中的n
- zrange key 0 -1 (withscores) --输出key的所有成员(并且输出分数),从小到大
- zcard key --输出key的元素的个数
- zrevrange key 0 -1 (withscore) --从大到小输出数据
- zremrangebyrank key 0 4 --按照下标删除key中的元素
- zremrangebyscore key score1 score2 --按照分数范围删除key中的元素
- zrangebyscore key score1 score2 withscore limit n m --输出key中分数范围在score1和score2之间的前2位,分数从小到大排序
- zincrby key n x--将key中的x的分数加n
- zcount key score1 score2 --输出key中分数范围在score1和score2之间的元素个数
keys的通用操作:
- keys * --获得所有keys
- key * my? --获得以my开头的keys
- del key1 key2 key3... --删除key1 key2 key3
- exists key --是否存在key,0 不存在,1 存在
- rename key newkey --重命名
- expire key time --设置key的过期时间time(秒)
- ttl key --获得key还剩多少时间过期(没有设置超时时间返回-1)
- type key--获得key的类型
Redis的特性:
- 多数据库
- 一个Redis可以创建多个数据库(最多16个,下标0-15,默认连接0),客户端可以指定连接哪个数据库。
- select n --切换数据库n
- move key n --将当前数据库中的key移动到n号数据库
- 事务
- multi --开启事务(和关系数据库begin差不多)
- exec --提交(和关系数据库的commit差不多)
- discard --回滚(和关系数据库的rollback差不多)
- 下面演示下事务的过程:开启两个客户端同时连接第0个数据库
Redis的持久化:
redis的高性能是因为它的数据都存储在了内存当中,为了保证redis在重启之后数据不会丢失,需要将数据从内存当中同步到磁盘上,这个过程叫持久化操作。redis有两种持久化方式。
- RDB方式:默认支持,不需要配置,指在指定的时间间隔内,将内存中的数据集快照写入到磁盘。
- AOF方式:以日志的方式记录服务器所处理的每一个操作,在redis服务启动之初,读取这个日志文件,重新构建数据库,来保证启动后数据库的数据是完整的
- 不持久化:通过配置,禁用持久化,redis将是一个缓存的形式存在
- 同时使用RDB和AOF方式
RDB
- 优势:
- 整个redis的数据库只包含一个文件
- 非常利于灾难恢复,只有一个文件利于copy
- 使用单独的子进程读写文件,保证了redis的高性能
- 缺点:
- 不能保证数据的高可用性,在时间间隔之间数据库出现宕机,来没来得及保存数据,数据会丢失
- 数据集非常大的时候,服务器需要停止较长时间处理保存数据的操作
- 配置:
- redis的解压根目录下,找到下面的文件,可以修改RDB的配置参数
AOF
- 优势:
- 更高的数据完整性(3中写入方式:每秒写入[异步写入,效率较高]、每修改写入[效率最低]、不持久化),最多丢失1s的数据
- 对日志文件用append追加形式操作,出现宕机不会影响已经写入的数据
- 日志过大,会自动启动重写机制
- 日志格式清晰,容易进行数据重建
- 缺点:
- 相同数据集,AOF的文件比RDB文件大
- 根据同步策略不同,运行效率低于RDB(每修改同步时,效率低)
- 配置:
- 修改完文件,将redis停掉,重新启动
总结:
Nosql
jedis
redis入门
redis的数据类型及常用命令
redis的持久化
Redis基础入门的更多相关文章
- spring boot集成redis基础入门
redis 支持持久化数据,不仅支持key-value类型的数据,还拥有list,set,zset,hash等数据结构的存储. 可以进行master-slave模式的数据备份 更多redis相关文档请 ...
- Redis基础入门,Redis的优点也特点,Redis五种数据类型
Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. 1.Redis的主要特点 Redis有三个主要特点,使它优越于其它键值数据存储系统 - Redis将 ...
- windows下使用redis,Redis入门使用,Redis基础命令
windows下使用redis,Redis入门使用,Redis基础命令 >>>>>>>>>>>>>>>> ...
- 1、Redis简介、安装和基础入门
-------------------------------------------------------- 主要内容包括: 1.Redis简介 2.Redis安装.启动.停止 3.Redis基础 ...
- Redis数据库入门基础,及优缺点介绍
简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 是一个高性能的key-value数据库.R ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_39、SpringBoot2.x整合redis实战讲解
笔记 3.SpringBoot2.x整合redis实战讲解 简介:使用springboot-starter整合reids实战 1.官网:https://docs.spring.io/spring-bo ...
- 转: Redis基础总结
转文:http://blog.csdn.net/basycia/article/details/52175429 1.redis是什么 2.redis的作者何许人也 3.谁在使用redis 4.学会安 ...
- 超强、超详细Redis数据库入门教程
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
- 超强、超详细Redis数据库入门教程(转载)
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...
随机推荐
- 常看本地是否安装Git和maven工具
打开cmd命令行工具: 查看git where git C:\Users\jasqia>where gitC:\Program Files\Git\cmd\git.exe 安装maven后需要到 ...
- Win10提示“因为文件共享不安全,所以你不能连接到文件共享”如何处理
在使用Windows10 1803版本系统连接CentOS6.5下搭建的Samba服务时,发现打开共享文件会遇到以下提示: 其实,该问题是Win10版本不兼容导致的.微软官方说明:https://go ...
- 解决IE11安装时需要“获取更新”(IE11离线安装)
方法一:说明:目前是针对Windows7 64位操作系统安装! 1. 在C盘下新建文件夹,取名为“IE11”. 2. 将官网下载的IE11离线包放到此文件夹中. 3. win + r 打开运行窗口,输 ...
- dedecmsV5.7织梦后台更新文章,发布时间不自动更新
问题:dedecmsV5.7后台修改文章的时候,会更新发布时间,需求是不自动更新时间,还是当时的发布时间 解决: 1.修改后台文件夹/templets/archives_edit.htm,articl ...
- 还能不能愉快地起一个web服务啦?——1st Step!白话http和代码交互的那点儿事儿~
学写python的时候,我们多多少少都接触到了web程序,然而你有没有想过,当浏览器发送了一个http请求时,等待接收这个请求的后端代码是一种什么样的思想感情? 就像下面这张图里画的一样,后端也许是一 ...
- exe所在路径
procedure TForm1.btn1Click(Sender: TObject); begin //完整路径 E:\UsrSoft\Desktop\FileNameDemo\Project1.e ...
- OO的奇妙冒险2
OO的奇妙冒险 ~多线程入门与魔鬼的优化~ 目录 总体分析 作业内容分析 作业内容总结 互测的收获 公测互测bug分析与总结 优化分析 不太正经的个人自嗨 总体分析 公测 中测(基础与进阶): 这一单 ...
- Git常用命令及使用,GitLab/GitHub初探,Git/Svn区别
Git安装配置及常用命令 0 Git本地分支管理 1 Git远程分支管理 2 Git Tag标签管理 3 Git Log日志 4 其它高级命令 5 常规使用及介绍 6 角色权限 7 分支定义 8 一般 ...
- Web基础学习
Servlet和Servlet容器.Web服务器概念:https://blog.csdn.net/lz233333/article/details/68065749 <初学 Java Web 开 ...
- SSH框架分页
DAO层 /** * 分页查询全部员工,获取总记录数 */ public int totalPage(String className); /** * 分页查看,查看首页 */ public List ...