Redis概述和常用数据类型

NoSQL概述

not only SQL

优势:

  • High Performance
  • Huge Storage
  • High Scalability & High Availibility

类型

部分代表

特点

列存储

Hbase

Cassandra

Hypertable

顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。

文档存储

MongoDB

CouchDB

文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。

key-value存储

Tokyo Cabinet/Tyrant

Berkeley DB

MemcacheDB

Redis

可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)

图存储

Neo4J

FlockDB

图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。

对象存储

db4o

Versant

通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

xml数据库

Berkeley DB XML

BaseX

高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

Redis概述

Redis是一种键值对数据库。

特征

  1. 数据间没有必然的关联关系
  2. 内部采用单线程机制进行工作
  3. 高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。
  4. 多数据类型支持
    • 字符串类型 string
    • 列表类型 list
    • 散列类型 hash
    • 集合类型 set
    • 有序集合类型 sorted_set
  5. 持久化支持。可以进行数据灾难恢复

应用

  • 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
  • 任务队列,如秒杀、抢购、购票排队等
  • 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
  • 时效性信息控制,如验证码控制、投票控制等
  • 分布式数据共享,如分布式集群架构中的 session 分离
  • 消息队列
  • 分布式锁

安装

安装之后修改安装目录下的redis.conf,将daemonize no改为daemonize yes

基本配置:

port 6379 #启动端口
daemonize yes #守护进程
logfile "6379.log" #日志文件名
dir /usr/local/redis/data #日志文件、持久化文件目录

启动redis的方式:

src/redis-server redis.conf

更改端口启动:

redis-server --port 6380

或者更改配置文件的port:(可在一台主机上启动多个服务)

连接时使用:

redis-cli -p 6380

配置服务:

mkdir /etc/redis
cp redis.conf /etc/redis/6379.conf
cp utils/redis_init_script /etc/init.d/redis

启动服务:

service redis start

默认端口:6379

Redis基本操作

Redis 命令参考 — Redis 命令参考

清除屏幕信息:clear

查看命令帮助:help 命令

String类型

String的最大存储量是512MB

String的用途之一是存文档(类似json数据)

键名通常有规范,例如user:id:xxxxxxx:fans(表名:主键名:主键值:字段名)

set key value [EX seconds] [DX miliseconds]

新增、更新键值对。它相当于 setex key seconds valuepsetex key milliseconds value

get key

获取值

del key

删除键值对

ttl key

查看ttl(剩余生存)时间

expire key seconds

设置过期时间

keys *

查看所有的key

mset key1 value1 key2 value2...

同时设置多个键值对,对应还有mget,可以同时取多个值

getset key

更新值的同时返回旧值。

incr key

自增value(只对纯数字的字符串有效)

decr value

自减value

incrby key num

以num值自增(decrby同理),类似的还有incrbyfloat(增加小数)

注意:
+ redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
+ 能获取的最大整数范围是java中long的最大值。

append key toAppend 

将一段字符串附加到旧值上。

strlen key

计算值的长度

setnx key value

(set not exist)如果key不存在则设置并返回1,如果key存在不更新返回0

Hash类型

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的存储结构:一个存储空间保存多个键值对数据

hash类型实际上值存的还是一个类似于哈希表的结构,里面的键值对叫field-value

注意事项
+ hash类型下的value只能存储字符串,不允许存储其他数据类型
+ 每个hash可以存储232-1个键值对
+ hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈

hset hashname field value

设置对应hash的键值对

hget hashname field

获取对应的哈希中对应的键对应的值

hmset hashname field1 value1 field2 value2... 

多重设置

hmget hashname field1 field2...

多重获取

hdel hashname

删除键

hsetnx hashname field value

类似setnx,只有不存在才添加。

hlen hashname

获取哈希中field的个数

hexists hashname field

判断field是否存在,存在返回1

hkeys hashname

获取某哈希所有的field名

hvals hashname

获取某哈希所有的value

hgetall hashname

获取所有的field名和value

hincrby hashname field increment

注意这个只有hincrby没有hincr

List类型

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序

list的元素可以重复

lpush listname val1 val2...
rpush listname val1 val2...

lpush从左边插入,rpush从右边插入。如果list不存在,会先创建list,然后插入。

lrange listname start stop

从左边数的范围,start和stop索引允许负值,-1代表最后一个元素,-2代表倒数第二个元素……

lpop listname 
rpop listname

从左边(右边)弹出元素

blpop listname timeout
brpop listname timeout

阻塞版本的lpop/rpop,如果此时列表中没有元素则阻塞,可以设置最长等待时间

llen listname

返回列表的长度

lset listname index value

修改列表中索引index对应的值

lindex listname index 

获取索引index对应的value

lrem listname count value

移除值等于指定值的元素count个

linsert listname before/after pivot value

这个pivot代表的是list中一个元素的值

Set类型

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
sadd setname member

向集合中添加元素

smembers setname

返回集合的全部成员

srem setname member

移除元素

scard setname

返回集合中元素的个数

sismember setname member

判断是否在集合里。

srandmember setname [count]

随机获取集合中指定数量的数据

spop setname

返回并移除随机一个元素

sinter setname1 setname2
sunion setname1 setname2
sdiff setname1 setname2

求两个集合的交、并、差集。

还有sinterstore等指令可以把结果存储到指定集合中。

smove source destination member

将元素从source集合中移动到destination中。

Sorted_set类型

  • 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段
zadd setname score1 member1 [score2 member2]

添加元素,注意要带上一个用于排序的数据(相当于权)。

zrange setname start end [withscores]
zrevrange setname start stop [WITHSCORES]

zrange从小到大显示指定元素范围,如果带有withscores则会连着score一起返回。
zrevrange相反,从大到小。

zcard setname
zcount setname min max

zcard显示集合中有多少个元素
zcount显示在min-max之间的元素有多少个

zrem setname member

移除member

zrangebyscore setname min max [WITHSCORES] [LIMIT];
zrevrangebyscore setname [WITHSCORES];

按条件获取处于min-max之间的数据

zremrangebyrank setname start stop
zremrangebyscore setname min max

zremrangebyrank按排名删除元素

zremrangebyscore删除值在min-max之间的元素

zrank setname member
zrevrank setname member

查看元素的正序或倒序排名

zscore setname member
zincrby setname increment member

score值获取与修改

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/redis%e6%a6%82%e8%bf%b0%e5%92%8c%e5%b8%b8%e7%94%a8%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b/

发表评论

电子邮件地址不会被公开。