回到顶部

×
原图

Redis学习(1)——概述和常用命令

关系型数据库(SQL)Mysql,oracle

特点:数据和数据之间、表和字段之间,表和表之间是存在关系的。

优点:数据之间有关系、进行数据的增删改查时非常方便、关系型数据库有事务操作,保证数据的完整性。

缺点:因为数据和数据之间是有关系的,关系是由底层大量算法保证,会拉低系统运行速度,消耗系统资源;海量数据时增删改查很可能宕机,维护/扩展也会不好。

适合处理一般量级数据,安全。

非关系型数据库(NOSQL)Redis

非关系数据库设计之初是为了替代关系型数据库的。

优点:海量数据的增删改查和维护非常轻松。

缺点:数据和数据之间没有关系,不能一目了然;没有事务保证数据的完整和安全。

适合处理海量数据,效率。不一定安全。

主流NOSQL数据库

image.png

NoSQL数据库的四大分类如下:

1键值(Key-Value)存储数据库

         相关产品:Tokyo Cabinet/TyrantRedisVoldemortBerkeley DB

         典型应用:内容缓存,主要用于处理大量数据的高访问负载。

         数据模型:一系列键值对

         优势:优秀的快速查询,稳定性强。

         劣势:存储的数据缺少结构化

2列存储数据库

 相关产品:CassandraHBaseRiak

 典型应用:分布式的文件系统

 数据模型:以列簇式存储,将同一列数据存在一起

 优势:查找速度快,可扩展性强,更容易进行分布式扩展

 劣势:功能相对局限,使用极大的内存才可调配,且系统处理算法时将有数秒甚至更长时间的不可用,导致大量处理超时

3文档型数据库(淘汰)

         相关产品:CouchDBMongoDb

         典型应用:Web应用(Key-Value类似,Value是结构化的)

         数据模型:一系列键值对

         优势:数据结构要求不严格

         劣势:查询性能不高,而且缺乏统一的查询语法

4图形(Graph)数据库

         相关数据库:Neo4JinfoGridinfiniteGraph

         典型应用:社交网络【关系网】

         数据模型:图结构

         优势:利用图结构相关算法

         劣势:需要对整个图做计算才能得出结果,不容易做分布式的集群方案。局限性过强    

Redis概述

Redis由来

2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统 LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo 便对MySQL 的性能感到失望,于是他决定亲自为 LLOOGG 量身定做一个 数据库,并并于 2009 年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将 Redis 用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年 Salvatore Sanfilippo Redis 开源发布,并开始和 Redis 的另一名主要的代码贡献者 Pieter Noordhuis 一起继续着 Redis 的开发,直到今天。

Salvatore Sanfilippo 自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News 2012 年发布了一份数据库的使用情况调查,结果显示有近 12% 的公司在使用 Redis。国内如 新浪微博、街旁网、知乎网,国外如GitHubStack OverflowFlickr等都是Redis的用户。

VMware 公司从2010年开始赞助 Redis 的开发,Salvatore Sanfilippo Pieter Noordhuis 也分别在3月和5月加入VMware,全职开发Redis

什么是 Redis

Redis 是用 C 语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止 Redis 支持的键值数据类型如下:

1. 字符串类型

2. 散列类型

3. 列表类型

4. 集合类型

5. 有序集合类型。

官方提供测试数据:50 个并发执行 100000 个请求,读的速度是 110000 /s,写的速度是 81000 /s。数据仅供参考,根据服务器配置会有不同结果。

 

Redis 的应用场景

缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)

聊天室的在线好友列表。

任务队列。(秒杀、抢购、12306等等)

应用排行榜。

网站访问统计。

数据过期处理(可以精确到毫秒)

分布式集群架构中的session分离。

Redis安装和启动

参考博客:http://localhost:8080/zjblog/toDetail?articleId=1903011210191700007

redis数据类型

redis使用的是键值对 保存数据(map)

key:全部都是字符串

value:有五种类型

image.png

 

Key名称:自定义,理论上不要过长否则影响使用效率(长度从小到大查询)。也不要太短,要有意义的。

Redis命令-String命令

概述:字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型存入和获取的数据将相同。在Redis中字符串类型的Value最多可以容纳的数据长度是512M

二进制安全和数据安全是没有关系的。

image.png

MySQL-关系型数据库,二进制不安全。【乱码、丢失数据】

image.png

赋值(相当于map.put

set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作,总是返回“OK”

取值(相当于map.get)

get key:获取keyvalue。如果与该key关联的value是不string类型的,Redis将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回(nil)

 

get key value:先获取该key的值,然后在设置该key的值,新的value会覆盖老的value

删除(相当于map.remove)

del key:删除指定key,返回受影响行数。

其他:

获取并修改值

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

递增

incr key:将指定的keyvalue原子性的递增1,如果该key不存在,其初始值为0,在incr之后其值为1.如果value的值不能转成整形,如hello,该操作将执行失败并返回相应的错误信息。相当于i++

递减

decr key:将指定的keyvalue原子性的递减1,如果该key不存在,其初始值为0,在decr之后其值为-1,如果value的值不能转成整形,如hello,该操作失败并返回相应错误。相当于i—

拼接字符串

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

将数值自增任意值

incrby key increment:将指定的keyvalue原子性增加increment,如果该key不存在,其初始值为0,在incrby后,该值为increment。如果该值不能转成整形,则失败并报错。

将数值递减任意值

decrby key decrement:将指定的keyvalue原子性增加decrement,如果该key不存在,其初始值为0,在incrby后,该值为-decrement。如果该值不能转成整形,则失败并报错。

 

String使用环境:主要用于保存json格式的字符串

Redis命令-hash命令

概述Redis中的Hash类型可以看成具有String KeyString Valuemap容器。所以该类型非常适合用于存储值对象的信息。如UsernamePassword等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。

赋值

hset key field value:为指定的key设定field/value(键值对)

hmset key field value field2 value2 …:设置key中的多个filed/value

取值

hget key field:返回指定的key中的field的值。

hmget key filed1 filed2 …:获取key中的多个filed的值

hgetall key:获取key中的所有filed-value

删除

hdel key field field..:可删除一个或者多个字段,返回值是被删除的字段个数。

del key:删除整个

增加数字

hincrby key field increment:设置keyfiled的值增加increment

其他命令

hexists key field:判断指定的key中的filed是否存在

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

hkeys kye:获取所有的字段

hvals key:获取所有的value

 

keys * 查询所有的key

Redis命令-list命令

概述:dis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是4294967295

      从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。

 

赋值(两端添加)

lpush key values1 values2 …:在指定的key所关联的list头部插入所有的values。如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。

rpush key values1 values2…:在该list的尾部添加元素。

 

取值(查看列表)

lrange key start end:获取链表中从startend的元素的值,startend0开始计数,也可以为负数,若为-1则标识链表尾部的元素。-2则表示倒数第二个,以此类推..

 

删除(两端弹出)

lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若存在则返回链表中的头部元素

rpop key:从尾部单出元素。

 

获取列表中的元素个数

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

 

删除某种元素(效率低)

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

 

通过索引替换元素(效率低)

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

 

在索引前/后插入元素(效率低)

linsert key before|after pivot value:在pivot元素前后插入value这个元素。

 

扩展命令

rpoplpush resource destination:将resource链表中的尾部元素弹出并添加到destination头部。

rpoplpush resource resource:将resource链表中的尾部元素弹出并添加到resource头部。(循环操作)

 

Redis命令-set命令

概述Set String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。集合中最大的成员数为232 - 1 (4294967295, 每个集合可存储40多亿个成员)

 

添加/删除元素

sadd key value value1…:向set中添加数据,如果该key的值已有则不会重复添加。

srem key members members1..:删除set中指定的成员。

 

取值

smembers key:获取set中所有元素

sismember key member:判断参数中指定的元素是否存在,1表示存在,0表示不存在或者该key本身就不存在。(无论集合中有多少元素都可以极速的返回结果).

 

集合运算

sdiff key1 key2 …:差集运算,返回kye1key2中相差的成员,而且与key的顺序有关。即返回差集。

image.png

sinter key1 key2 …:返回交集

image.png

sunion key1 key2 ..:返回并集。

image.png

扩展命令

scard key:获取set中元素数量

srandmember key:随机返回一个元素

sdiffstore destination key1 key2..:将key1key2相差的成员存储在destination

sinterstore destination key1 key2..:将返回的交际存储在destination

sunionstore destination key1 key2..:将返回的并集存储在destination

Redis命令-有序set命令(zset)

概述Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

有序set集合: 有序,不重复。专门用来做排行榜

 

添加元素

zadd key score member score2 member2 …:将所有成员以及该成员的分数放到sorted-set中。如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。

 

获取元素

zscore key member:返回指定成员的分数。

 

删除元素

zrem key member member…移除集合中指定成员,可以指定多个。

 

范围查询(顺序查看)

zrange key start end [withscores] : 获取集合中脚标为start-end的成员,withscores参数表明返回的成员包含其分数。(分数有小到大排列)

zrevrange key start end [withscores] : 获取集合中脚标为start-end的成员,withscores参数表明返回的成员包含其分数。(分数大到小排列)

zremrangebyrank key start stop按照排名范围删除元素

zremrangebyscore key min max  : 按照分数范围删除元素

 

扩展命令

zrangebyscore key min max [withscores] [limit offset count]: 返回分数在[minmax]的成员并按照分数从低到高排序。[withscores]:显示分数;[limit offset count]offset,表明脚标为offset的元素开始并返回count个成员。

zincrby key increment member:设置指定成员的增加的分数。返回值时更改后的分数。

zcount key min max:获取分数在[min,max]之间的成员。

zrank key member:返回成员在集合中的排名。索引(从小到大)。

zrevrank key member:返回成员在集合中的排名。索引(从大到小)。

 

Redis命令-通用命令

keys pattern:获取所有与pattern匹配的key,返回所有与该key匹配的keys*表示任意一个或多个字符,?表示任意一个字符。

del key1 key2 ..:删除指定的key

exists key:判断该key是否存在,1代表存在,0代表不存在。

rename key newkey:为当前的key重命名

expire key time:设置过期时间,单位:秒。过期即删除。

ttl key:获取该key所剩的超时时间,如果没有设置超时,返回-1.如果返回-2表示超时不存在。

type key:获取指定key的类型。该命令将以字符串的格式返回。返回的字符串为stringlistsetHashzset。如果key不存在返回none

 

redis服务器命令

ping:测试连接是否存活。ping成功返回PONG

echo:在命令行打印一些东西。echo “HELLO WORLD

select:选择数据库。redis数据库编号【0-15】,选择16是报错;

quit:退出连接;

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

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


留言评论