redis缓存数据库

NoSQL = Not Only SQL = 不仅仅是SQL,泛指非关系型的数据库,超大规模和高并发的SNS(social network society)暴露了很多难以克服的问题,而NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

一、NoSQL数据库的四大分类

1.键值(Key-Value)存储数据库 开发
这一类数据库主要会使用到一个哈希表,hash(key) Key/value模型简单、易部署。但是如果只对部分值进行查询或更新的时候,Key/value就显得效率低下了。Redis

2.列存储数据库。 大数据
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。如:Cassandra, HBase, Riak.

3.文档型数据库
同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。MongoDb.

4.图形(Graph)数据库 图形
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。

NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。

二、redis
redis是业界主流的key-value nosql 数据库之一。支持存储的value类型包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
在此基础上,redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

1.Redis优点
异常快速 : Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。
操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。
MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列,以及在应用程序如:Web应用程序会话,网站页面点击数等任何短暂的数据中使用

2.windows安装Redis环境
Windows 下安装 下载地址:https://github.com/tporadowski/redis/releases。
下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。打开文件夹,在地址栏输入cmd打开一个 cmd 窗口 输入redis-server.exe redis.windows.conf启动服务端
再另启一个 cmd 窗口,原来的不要关闭,切换到 redis 目录下运行:redis-cli.exe -h 127.0.0.1 -p 6379连接redis进行操作。

3.API使用

① String操作 key-value存储

 SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
 set name1 feng ex 10
 set name2 zhao NX

参数:
ex,过期时间(秒)
px,过期时间(毫秒)
nx,如果设置为True,则只有key不存在时,当前set操作才执行
xx,如果设置为True,则只有key存在时,当前set操作才执行

SETNX key value
SETNX name3 xx

设置值,只有name不存在时,执行设置操作(添加)time,过期时间(数字秒)

SETEX key seconds value
SETEX name4 10 as

批量设置值

MSET key value [key value ...]
mset iphon 5800 xiaomi 2000 huawei 1000
keys * 查看当前所有键

获取值

 GET key
 get name

批量获取

MGET key [key ...]
mget iphon xiaomi huawei

设置新值并获取原来的值

GETSET key value
getset name zhaozhao

获取子序列

GETRANGE key start end
getrange name 5 7

修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后覆盖)

SETRANGE key offset value
setrange name 5 \

对key对应值的二进制表示的位进行操作,可用来做用户登录统计,初始化全0,登录用户id的对应为改为1

SETBIT key offset value

offset,位的索引(将值变换成二进制后再进行索引)从0开始。value值只能是 1 或 0。

name2 = "zhao",
    那么字符串zhao的二进制表示为:01111010 01101000  01100001 01101111 
    所以,如果执行 `setbit name2 6 0 ` 则就会将第6位设置为0,
    那么最终二进制则变成 01111000 01101000  01100001 01101111,即:"xhao"

如果value是汉字。对于utf-8,每个汉字占 3 个字节,for循环时候会按照字节迭代,在迭代时,将每一个字节转换十进制数,然后再将十进制数转换成二进制

获取key对应的值的二进制表示中的某位的值

GETBIT key offset
GETBIT name2 7

获取key对应的值的二进制表示中 1 的个数

 BITCOUNT key [start end]
 bitcount name2

返回key对应值的字节长度(一个汉字3个字节)

STRLEN key
strlen name2

自增

 INCR key
 set count 23
 incr count

浮点自增

INCRBYFLOAT key increment
INCRBYFLOAT count 4

自减

DECR key
decr count

追加

APPEND key value
append name2 xiaofeng

② Hash操作 key-value(key-value)
添加

HSET key field value
hset info name rain
hset info age 22

批量添加

HMSET key field value [field value ...]
hmset info sex male hobby m

对应的hash中获取根据key获取value

HGET key field
hget info name
HMGET key field [field ...]
hmget info name sex

获取所有键和值

HGETALL key
hgetall info

获取对应的hash中键值对的个数

hlen key
hkeys key
hvals key
hexists key field
hdel key field
hincrby key field increment
hincrbyfloat key field increment

匹配

HSCAN key cursor [MATCH pattern] [COUNT count]
hscan info 0 match *a* COUNT 1

cursor,游标(基于游标分批取获取数据)
match,匹配指定key,默认None 表示所有的key
count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数

③ list 在内存中按照一个key对应一个List来存储。

在对应的list中添加元素,每个新的元素都添加到列表的最左边

LPUSH key value [value ...]
lpush loa zhao feng fan 
lpushx key value 只有key已经存在时,值添加到列表的最左边
rpush loa zhao1 feng1 fan1  每个新的元素都添加到列表的最右边
rpushx key value 表示从最右边操作

对应的list元素的个数

llen key
llen loa

在对应的列表的某一个值前或后插入一个新值

LINSERT key BEFORE|AFTER pivot value
linsert loa before feng dd

对对应的list中的某一个索引位置重新赋值

lset key  index value
lset loa 7 eng

在对应的list中删除指定的值,count=2,从前到后,删除2个;count=-2,从后向前,删除2个

LREM key count value
lrem loa 1 he

在对应的列表的左侧获取第一个元素并在列表中移除,返回值则是第一个元素

lpop key
lpop loa
rpop loa 表示从右向左操作

在对应的列表中根据索引获取列表元素

lindex key index
lindex loa 5

在对应的列表分片获取数据

lrange key start end
lrange loa 0 -1

在对应的列表中移除没有在start-end索引之间的值

ltrim key start end
ltrim loa 3 6

从一个列表取出最右边的元素,同时将其添加至另一个列表的最左边

rpoplpush from to
rpoplpush loa loa1
brpoplpush from to

将多个列表排列,按照从左到右去pop对应列表的元素

blpop key [key ...] timeout
blpop loa3 loa4 10
brpop key [key ...] timeout

当元素所有列表的元素获取完之后,阻塞等待列表内有数据的时间(秒), 0 表示永远阻塞

set集合操作 不允许重复的列表

对应的集合中添加元素

SADD key member [member ...]

获取对应集合中元素个数

SCARD key

在第一个对应的集合中且不在其他对应的集合的元素集合

SDIFF key [key ...]

获取第一个对应的集合中且不在其他对应的集合,再将其新加入到dest对应的集合中

SDIFFSTORE destination key [key ...]

获取多个对应集合的交集

SINTER key [key ...]

获取多个对应集合的交集,再将其加入到dest对应的集合中

sinterstore destination key [key ...]

以下需要用到时help即可

检查value是否是name对应的集合的成员sismember
获取对应的集合的所有成员smembers
将某个成员从一个集合中移动到另外一个集合smove
从集合的右侧(尾部)移除一个成员,并将其返回spop
从对应的集合中随机获取 numbers 个元素srandmember
在对应的集合中删除某些值srem
获取多个对应的集合的并集sunion
获取多个对应的集合的并集,并将结果保存到dest对应的集合中sunionstore
同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大sscan

有序集合

在对应的有序集合中添加元素zadd
获取对应的有序集合元素的数量zcard
获取对应的有序集合中分数 在 [min,max] 之间的个数zcount
自增对应的有序集合对应的分数zincrby
按照索引范围获取对应的有序集合的元素zrange 
从大到小排序zrevrange
按照分数范围获取对应的有序集合的元素zrangebyscore
从大到小排序zrevrangebyscore
获取某个值在对应的有序集合中的排行(从 0 开始)zrank
从大到小排序 zrevrank(name, value),
删除对应的有序集合中值是values的成员zrem
根据排行范围删除zremrangebyrank
根据分数范围删除zremrangebyscore
获取对应有序集合中 value 对应的分数zscore
获取两个有序集合的交集,如果遇到相同值不同分数,则按照aggregate进行操作zinterstore aggregate的值为:  SUM  MIN  MAX
获取两个有序集合的并集,如果遇到相同值不同分数,则按照aggregate进行操作zunionstore 

其他操作
删除redis中的任意数据类型delete
检测redis的name是否存在exists
根据模型获取redis的keys(pattern='*')

KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
为某个redis的某个key设置超时时间expire
对redis的key重命名为rename
将redis的某个值移动到指定的db下,一共可以有16个db。 move 只可移不冲突的
随机获取一个redis的name(不删除)randomkey()
获取key对应值的类型type
同字符串操作,用于增量迭代获取key 
切换db。 select
scan(cursor=0, match=None, count=None)
scan_iter(match=None, count=None)

3.pycharm使用redis

easy_install redis

redis-py默认在执行每次请求都会创建(连接池申请连接)和断开(归还连接池)连接操作,如果想要在一次请求中指定多个命令,则可以使用pipline实现一次请求指定多个命令,并且默认情况下一次pipline是原子性操作。

import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
r = redis.Redis(connection_pool=pool)
# 事务transaction
pipe = r.pipeline(transaction=True)
pipe.set('namex', 'a')
pipe.set('namey', 'b')
pipe.execute( )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值