redis
一:nosql和sql的比较
优点:
1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。
2)查询速度:nosql数据库将数据存储于缓存(内存)之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。
3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而关系型数据库则只支持基础类型。
4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点:
1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。
2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。
3)不提供关系型数据库对事务的处理。
二:什么是redis?
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s ,
且Redis通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型有:字符串、哈希、列表、集合、有序集合。
三:redis的应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)
聊天室的在线好友列表
任务队列。(秒杀、抢购、12306等等)
应用排行榜
网站访问统计
数据过期处理(可以精确到毫秒)
分布式集群架构中的session分离
四:redis在linux上的安装
1:将redis压缩包解压到/opt目录下
2:解压完成后进入redis-3.2.5目录执行make命令(需要先安装gcc)
3:运行make distclean之后再 执行make
4:跳过Redis test 继续执行make install
五:redis的启动、进入和关闭命令
未备份redis.conf文件时的启动:redis-server
备份后的启动:redis-server + 备份后的redis.conf路径
进入redis:redis-cli
退出redis:shutdown
六:配置redis在后台启动
1、备份redis.conf:拷贝一份redis.conf到其他目录(~目录的myredis下)
2、修改redis.conf(复制出来的那份)文件将里面的daemonize no 改成 yes,让服务在后台启动
七:redis相关
1. 默认16个数据库,类似数组下标从0开始,初始默认使用0号库
3. 统一密码管理,所有库都是同样密码,要么都OK要么一个也连接不上。
4. Redis是单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,
如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)
八:命令
1:通用命令
(1):keys * 查看当前数据库所有的键
(2):select [下标] 切换数据库
(3):exists [key值] 查看key是否存在
(4):type [key值] 查看key的类型
(5):del [key值] 删除key
(6):expire [key值] [时间] 给key设置存在时间,单位秒,默认永久存在
(7):ttl [key值] 查看key还有多久过期,-1表示永不过期,-2表示已经过期
(8):dbsize 查看当前数据库key的总数
(9):flushdb 清空当前数据库
(10):flushall 清空全部数据库
2:string类型数据命令
(1)get <key> 查询对应键值
(2)set <key> <value> 添加键值对
(3)append <key> <value> 将给定的<value> 追加到原值的末尾
(4)strlen <key> 根据key获得值的长度
(5)setnx <key> <value> 只有在 key 不存在时设置 key 的值
(6)incr <key> 将 key 中储存的数字值增1,只能对数字值操作,如果为空,新增值为1
(7)decr <key> 将 key 中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1
(8)incrby / decrby <key> <步长> 将 key 中储存的数字值增减。自定义步长。
(9)mset <key1> <value1> <key2> <value2> ..... 同时设置一个或多个 key-value对
(10)mget <key1> <key2> <key3> ..... 同时获取一个或多个 value
(11)msetnx <key1> <value1> <key2> <value2> ..... 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
(12)getrange <key> <起始位置> <结束位置> 获得值的范围,类似java中的substring
(13)setrange <key> <起始位置> <value> 用 <value> 覆写<key> 所储存的字符串值,从<起始位置>开始。
(14)setex <key> <过期时间> <value> 设置键值的同时,设置过期时间,单位秒。
(15)getset <key> <value> 以新换旧,设置了新值同时获得旧值。
3:List类型数据命令
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
(1)lpush/rpush <key> <value1> <value2> <value3> .... 从左边/右边插入一个或多个值。
(2)lpop/rpop <key> 从左边/右边吐出一个值。吐出来就相当于剪切,原来的就没了
(3)rpoplpush <key1> <key2> 从<key1>列表右边吐出一个值,插到<key2>列表左边。
(4)lrange <key> <start> <stop> 按照索引下标获得元素(从左到右)
(5)lindex <key> <index> 按照索引下标获得元素(从左到右)
(6)llen <key> 获得链表长度
(7)linsert <key> before <value> <newvalue> 在<value>的前面插入<newvalue>
(8)lrem <key> <n> <value> 从左边删除n个value(从左到右)
4:set数据类型命令
set和list类似,但有不同点,自动去重以及无序它底层是value为null的Hash表,所有增删查的复杂度都是O(1)
(1)sadd <key> <value1> <value2> ..... 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
(2)smembers <key> 取出该集合的所有值。
(3)sismember <key> <value> 判断集合<key>是否为含有该<value>值,有返回1,没有返回0
(4)scard <key> 返回该集合的元素个数。
(5)srem <key> <value1> <value2> .... 删除集合中的某个元素。
(6)spop <key> 随机从该集合中吐出一个值。吐出来意味着就会被删除掉
(7)srandmember <key> <n> 随机从该集合中取出n个值。不会从集合中删除
(8)sinter <key1> <key2> 返回两个集合的交集元素。
(9)sunion <key1> <key2> 返回两个集合的并集元素。
(10)sdiff <key1> <key2> 返回两个集合的差集元素。
5:Hash数据类型命令
(1)hset <key> <field> <value> 给<key>集合中的 <field>键赋值<value>
(2)hget <key1> <field> 从<key1>集合<field> 取出 value
(3)hmset <key1> <field1> <value1> <field2> <value2>... 批量设置hash的值
(4)hexists key <field> 查看哈希表 key 中,给定域 field 是否存在。
(5)hkeys <key> 列出该hash集合的所有field
(6)hvals <key> 列出该hash集合的所有value
(7)hincrby <key> <field> <increment> 为哈希表 key 中的域 field 的值加上增量 increment
(8)hsetnx <key> <field> <value> 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在
6:Zset数据类型命令
和set类似,但是里面的每个值都有个对应的分数,Zset会通过分数来升序排列这些值,值不能重复但是分数可以
(1)zadd <key> <score1> <value1> <score2> <value2>... 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
(2)zrange <key> <start> <stop> [WITHSCORES] 返回有序集 key 中,下标在<start> <stop>之间的元素(包含start和stop的)带WITHSCORES,可以让分数一起和值返回到结果集。
(3)zrangebyscore key min max [withscores] [limit offset count] 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
(4)zrevrangebyscore key max min [withscores] [limit offset count] 同上,改为从大到小排列。
(5)zincrby <key> <increment> <value> 为元素的score加上增量
(6)zrem <key> <value> 删除该集合下,指定值的元素
(7)zcount <key> <min> <max> 统计该集合,分数区间内的元素个数
(8)zrank <key> <value> 返回该值在集合中的排名,从0开始。
九:在idea连接redis
1. Jedis所需要的jar包
commons-pool2-2.4.2.jar
jedis-2.8.1.jar
2. 用windows中的IDEA连接虚拟机的Redis的注意事项
先查看防火墙的状态
service iptables status
1. 禁用Linux的防火墙:
2. 临时禁用:service iptables stop
3. 关闭开机自启:chkconfig iptables off
4. redis.conf中注释掉bind 127.0.0.1(61行) ,然后 protect-mode(80行)设置为 no。
3. Jedis测试连通性
public class Demo01 {
public static void main(String[] args) {
// 连接Redis服务
Jedis jedis = new Jedis("192.168.1.100",6379);
//查看服务是否运行,打出pong表示OK
System.out.println("connection is OK==========>: "+jedis.ping());
}
}