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是一种键值对数据库。
特征
- 数据间没有必然的关联关系
- 内部采用单线程机制进行工作
- 高性能。官方提供测试数据,50个并发执行100000 个请求,读的速度是110000 次/s,写的速度是81000次/s。
- 多数据类型支持
- 字符串类型 string
- 列表类型 list
- 散列类型 hash
- 集合类型 set
- 有序集合类型 sorted_set
- 持久化支持。可以进行数据灾难恢复
应用
- 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等
- 任务队列,如秒杀、抢购、购票排队等
- 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等
- 时效性信息控制,如验证码控制、投票控制等
- 分布式数据共享,如分布式集群架构中的 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基本操作
清除屏幕信息:clear
查看命令帮助:help 命令
String类型
String的最大存储量是512MB
String的用途之一是存文档(类似json数据)
键名通常有规范,例如user:id:xxxxxxx:fans
(表名:主键名:主键值:字段名)
set key value [EX seconds] [DX miliseconds]
新增、更新键值对。它相当于 setex key seconds value
和 psetex 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/