redis使用详解

redis使用详解

NoSQL(Not Only SQL)意思是"不仅仅是SQL",是一项全新的数据库理念,泛指非关系型的数据库。
随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系型数据库产品的发展非常迅速。而传统的关系型数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,如:对数据库高并发读写的需求(如:网站的实时统计在线用户的状态,记录热门帖子的点击次数,投票计数等)、对海量数据的高效率存储和访问的需求(如:大型web网站的用户登录系统,例如腾讯,动辄数以亿计的帐号)、对数据库的高可扩展性和高可用性的需求(对于很多需要24消失不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢),NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NOSQL数据库的四大分类:
(1)、键值(Key-value)存储数据库
相关产品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型应用:内容缓存,主要用于处理大量数据的高访问负载。
数据类型:一系列键值对
优势:快速查询
劣势:存储的数据缺少结构化
(2)、列存储数据库
相关产品:Cassandra,HBase,Riak
典型应用:分布式的文件系统
数据类型:以列簇式存储,将同一数据存在一起
优势:查找数度快,可扩展性强,更容易进行分布式扩展
劣势:功能相对局限
(3)、文档型数据库
相关产品:CouchDB、MongoDB
典型应用:Web应用(与Key-value类似,Value是结构化)
数据类型:一系列键值对
优势: 数据结构要求不严格
劣势: 查询性能不高,而且缺乏统一的查询语法
(4)、图形(Graph数据库)
相关产品:  Neo4J、InfoGrid、Infinite Graph
典型应用:  社交网络
数据类型:  图结构
优势: 利用图结构相关算法
劣势: 需要对整个图做计算才能得出结果,不容易做分布式的集群方案。
NoSQL特点:易扩展、大数据量,高性能、灵活的数据模型、高可用。

这里我主要介绍的是Redis的使用,下面进入正题:
Redis是用C语言开发的一个开源的高型你呢个键值对(key-value)数据库,它通过提供多种键值对数据类型来适应不同的场景下的存储需求,目前位置Redis支持的键值对数据类型如下:
后面为对应的java中的五种API实现
1、字符串类型---------String
2、散列类型-----------HashMap
3、列表类型-----------LinkedList
4、集合类型-----------HashSet
5、有序集合类型------TreeSet(根据大小进行排序)
Redis的应用场景有:
(1)、缓存(数据查询、短连接、新闻内容、商品内容等等)
(2)、聊天室的在线好友列表
(3)、任务队列(秒杀、抢购、12306等)
(4)、应用排行榜
(5)、网站访问统计
(6)、数据过期处理(可以精确到毫秒)
(7)、分布式集群架构中的session分离。
关于key的定义,需要注意几点:
(1)、key不要太长,最好不要超过1024个字节,这不仅会消耗内存还会降低查找效率。
(2)、key不要太短,如果太短会降低key的可读性
(3)、在项目中,key最好有一个统一的命名规范。
Redis的使用:
1、字符串----------------String
增:   set  键   值
删:   del   键
改:   set   已经存在的键   新值
查:    get   键 (如果获取一个不存在的键,会返回nil)
    自增:    incr  键  (键如果不存在,那么初始化为0,自增后为1,如果键存在,自增)
    自减:    decr  键  (键如果不存在,那么初始化为0,自减后为-1,如果存在,自减)

getset key value:先获取该key的值,然后再设置该key的值。

incrby key increment:将指定的key的value原子性增加increment,如果该key不存在,初始化这个值为0,在incrby之后,该值为increment。如果该值不能转成整型,如hello则失败并返回错误信息。

decrby key decrement: 将指定的key的value原子性减少decrement,如果该key不存在,初始化值为0,在decrby之后,该值为-decrement。如果该值不能转成整型,如hello则失败并返回错误信息。

append  key  value:拼凑字符串。如果该key存在,则在原有的value后追加该值;如果该key不存在,则重新创建一个key/value

2、散列类型-------------HashMap

Redies中的Hash类型可以堪称具有String Key和String Value的map容器。所以该类型非常适合于存储键值对象的信息。每一个Hash可以存储4294967295个键值对。

增 hset   集合名  键   值

hmset  集合名  键  值  键  值  键  值.............

hdel    集合名   键(0   表示删除字段不存在)

del     集合名 (删除整个list)  

hset    集合名   已经存在的键  新值

hget    集合名   键

hmget   集合名   键1   键2........

hgetall    集合名(所有键值对)

hincrby key field increment: 设置key中field的值增加increment(hash中没有hincr)

hexists key field: 判断指定的key中的field是否存在,存在返回1,不存在返回0

hlen key: 获取key所包含的field的数量

hkeys key: 获得所有的key

hvals key: 获得所有的value

3、列表类型-----------LinkedList

lpush  list01  a  b  c(从头部left插入数据)

rpush  list02  1  2  3(从尾部right插入数据)

lpop  list01 (从头部移除或弹出)

rpop  list01(从尾部移除)

lset list02  1  100(修改索引为1的位置的值为100)

lrange  list01  0  2(0和2表示索引)

lrange  list02  0  -1(-1表示倒数第一位)

llen  key:返回指定key关联的链表中元素的数量。

lpushx   key  value:仅当参数中指定的链表存在时,才能向它的头部插入数据,如果该key链表不存在,将不进行插入。

rpushx  key  value:在该list的尾部添加元素。

lrem  key  count  value:删除count个值为value的元素,如果count大于0,从头到尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。

lset  key  value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛出异常

linsert  key  before|after pivot value:在pivot元素前或后插入value这个元素,如果pivot元素不存在,则返回-1

rpoplpush  key key:将链表中的尾部元素弹出并添加到头部。  通常被用于消息队列中(消费者与生产者)

4、集合类型-----------HashSet

sadd  set01 hello test  aha test

srem  set01 xxxx

smembers  set01

sismember  set01 xxx--判断xxx是否在set01中存在

sinter   set02  set03 (取交集)

sunion  set02   set03(取并集)

sdiff    set02    set03(属于set02不属于set03的数据)

scard set02 :获取set中成员的数量

srandmember  set02:随机返回set中的一个成员

sdiffstore  my1 mya1 mya2:将mya1 mya2....相差的成员存储在my1上。

sinterstore  my1  mya1  mya2:将mya1  mya2.....返回的交集存储在my1上。

sunionstore  my1  mya1  mya2:将返回的并集存储在my1上。

5、有序集合类型------TreeSet(根据大小进行排序)

zadd  tree01  60  huluwa  99  niuniu  30 mantou (按照前面的数字进行排序,输出只有字符串)

zrem  tree01   huluwa

zremrangebyrank  tree01  0   1(按照名次区间删除数据,包左包右)

zremrangebyscore   tree01  30  50(按照分数区间删除数据)

zadd  test01  50  mantou(新分数旧名称)

zrange  test01   0  -1

zrange   test01   0  -1  withscores(带着分数)

zscore  test01  niuniu(获取分数)

zcard   test01  (返回元素个数)

zrevrange  test01  0  -1  withscores:照元素分数从大到小的顺序返回索引从0到-1之间所有元素(包含两端的元素)

zrangebyscore  test01  min   max withscores:返回分数在[min,max]的成员并按照分数从低到高排序。

zincrby  mytest  3  lisi:设置指定成员的增加的分数,返回值是更改后的分数。

zcount  mytest 33  80:获取分数在此成绩之间的成员个数。

zrank   key  member: 返回成员在集合中的排名.()

6、keys

添加任意数据结构数据时,都添加key

del  xxxxx

rename  list02  02list----------修改名字

keys  *-----------------------------查询所有

type  键-----------------------对应的数据类型

exits  键-----------------------判断键是否存在

expire  键  时间--------------设置生命周期,存活时间

ttl    键---------------------------查询倒计时间,如果已死就是-2,没有设置存活时间,就返回-1

7、Java与redis交互的实现的API为Jedis

用于Java程序与Redis数据库的交互,与JDBC作用一致。

 使用数据库连接池
      //1、创建配置对象
      GenericObjectPoolConfig pc = new JedisPoolConfig();
      pc.setMaxTotal(30);
      pc.setMaxIdle(10);
      ....
      //2、创建连接池
      JedisPool pool = new JedisPool(pc,"ip",6379);

      //3、获取并使用
      Jedis j = pool.getResource();
       j.set("name","xixi");
      //4、使用资源
      fianlly {
	if(j != null){
		j.close();
	}
	if(pool != null){
		pool.close();
	}
      }
8、redis特性

A、关于DataBase

1)、虽然redis没有建库操作,不过内置了16个数据库db0-db15,默认使用db0

2)、其余库使用   select 库编号

3)、数据库数据移植  move  xxxxx  库编号

B、服务器命令

ping 测试连接是否成功  成功就是pong

echo: 在命令行打印一些内容

select 数据库编号0-15选择数据库

quit:退出连接。

dbsize: 返回当前数据库中key的数目。

info: 获取服务器的信息和统计。

flushdb:删除当前选择数据库中的所有key

flushall:删除所有数据库中的所有key

C、信息的订阅与发布

客户端订阅某方面的数据

服务器端产生对应数据之后,客户端可以马上接受到

订阅1:

subscribe  关键字--------客户端

publish   关键字 xxxxx

订阅2:

psubscribe  关键字* -------客户端

publish   关键字  xxxxxx

D、redis事务的特征

A、在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis不会再为其他客户端的请求提供任何服务,从而保证了事务中所有命令被原子的执行。

B、和关系型数据库中的事务相比,在Redis事务中如果有一条命令执行失败,其后的命令仍然会被继续执行。

C、我们可以通过multi命令开启一个事务,有关系型数据库开发经验的人可以将其理解为”begin transaction”语句。在该语句之后执行的命令都将被视为事务之内的操作,最后我们可以通过执行exec/discard命令来提交/回滚该事务内的所有操作。这两个Redis命令可被视为等同于关系型数据库中的commit/rollback语句。

multi:开启事务用于标记事务的开始,其后执行的命令都将被存入命令队列,知道执行exec时,这些命令才会被原子的执行。

exec:提交事务

discard:事务回滚

9、redis持久化

Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者组合使用。

1、ROB持久化(默认支持,无需配置)

该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。

序列化后的文件dump.rdb文件

时间间隔是动态的

save  60  10000-------一分钟内超过10000个操作就备份。

save  300  10--------五分钟内超过10个操作就备份。

save  900  1----------十五分钟有1个操作就备份。

2、AOF持久化-------AppendOnly  File(数据追加到文件)

该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件重新构建数据库,以保证启动后数据库中的数据是完整的。

提供了三种同步策略,即每秒同步(everysec异步,也会丢失这1秒的数据)、每修改同步(always同步)和不同步(no)。

A、默认无启用

vi  redis.conf------>appendonly  yes

B、重启数据库,是配置生效。

C、访问数据库,使用的SQL语句就会被记录到appendonly.aof文件中。

3、数据恢复

进入到appendonly.aof更改删除操作的命令。重启服务就可以开启了。

你可能感兴趣的:(工具)