技术分享-Redis(1)

redis配置和开发

        Redis在编程领域应该属于数据库技术一块,属于非关系型数据库。其最具有优势的三大特性:开源、基于内存(- -)和灵活的数据结构! 

1、开源的东西都是好东西- -,没有反对的吧。就举一个简单的例子。Python对其源码的开源,引进了非常多的技术:

         基于数据库又高于数据库操作的数据分析包->pandas;

         图像计算/矩阵计算包->numpy 

        科学计算包->scipy 

        图形处理包->cv2 

        数据绘画包->matplotlib 

        web框架->django/tonador/flask 

        UI制作包->QT 

        总而言之,群众的力量是颠覆性的

 2、基于内存的存储方式。这个厉害!!!。官方说redis的读取峰值能达到220K/s,而大多博客测试都是在110K左右,我猜测这跟计算机配置以及代码逻辑有一定关系。 其实大多数数据库比如mysql、sqlserver,都有一定程度的memory存储方式。本人做过很长时间的sqlserver开发,sqlserver的读取是非常非常非常占内存的,从数据库读取的数据,会一直存放在内存里, 当且仅当后来者需要用到内存时,才会把sqlserver占用的内存给挤掉。但是其实redis也会在一定的时间点对memory中的数据存入disk。所以,其实redis在存储方式最大的区别在于其存和读都在缓存,而其他数据库 则存都在磁盘,读可能在内存,可能在磁盘。  当然其实redis不是所有的数据都存在缓存里,不然迟早得爆炸。redis会有“快照”模式,在一定的checkpoint对数据进行磁盘保存操作。因此redis最有可能宕掉的时候,就是这个时候。这些设置都在其配置文件里, redis的所有设置都在redis.conf文件里,这里不进行完整赘述,官方文档传送门:https://redis.io/documentation 

3、数据结构。redis主要提供了大四种数据结构:

(1)key-value,这个可以理解为单字符赋值。但是redis的key-value非常有意思也非常有用的一点就是可以设置生命周期,它的expire命令可以设置一个键值对在多久后失效, 这个在web服务里面用处非常非常大,如:设置用户登陆有效时间。 

(2)list,redis的list严格而言应该叫队列,并且队列的读取方向是双向的,类似于python的deque,其在web服务应用也是炒鸡大,如:热点推送,任务分发; 

(3)dict这个dict可以理解为 key-value的集合,同理于python的字典。 本次技术分享,主要从三大方面对redis做一些介绍。

(4)set。Redis把集合分成普通集合和有序集合,在此作一种数据类型说明

这一次的技术博客先对redis的安装和配置作一些分享,下一章将会介绍其数据结构的用法

 一、下载安装(以ubuntu 16.4 为例) 

1、首先,更新一下。shell:apt update  

2、然后安装redis。shell:apt install redis-server

3、测试是否正确安装。shell:redis-server,若出现以下界面说明redis已经装好了!!!是不是很快!!!


技术分享-Redis(1)

4、redis默认端口为6379,要想修改该配置,可以在redis.conf里面修改。这部分内容后面作介绍。

5、指定端口启动方式:shell:redis-server --port 6380。该方法会以6380位端口启动redis,注意port前面是两个连着的“-”

6、以上是服务端的启动方法。客户端启动如下:shell:redis-cli。该方法默认启动连接6379端口的客户端。

7、指定端口启动方式:shell:redis-cli -p 6380。该方法会启动客户端并连接6380服务器端口

8、其他指定操作:shell:redis-cli -h 127.0.0.1 -p 6380 -a 321 。-h 指服务器IP,-p指端口号,-a指连接密码。其具体设置方法下章会介绍。

9、关闭redis。(1)Ctrl+c。在服务器命令台下输入Ctrl+C即可;(2)新建命令行,shell:redis-cli shutdown(注意,是直接在命令行输入。如果登录了redis-client后输入shutdown时直接关闭客户端而不是服务端)


在Redis中,主要有五大数据结构:单键值key-value、双向队列、字典、集合和有序集合

1、key-value

(1)set key value

redis设置键值对的形式非常灵活,你基本可以任意设计键和值的样子。如

set a b(键为a,值为b)

set a-a b-b(键为a-a,值为b-b)

set watermelon:201806 0.5(键为watermelon:201806,值为0.5)

另:redis支持对键值对设置超时删除操作,即在设鼎的时间后自动删除该键,有如下两种方式

1)set  a b ex 10(设置键为a,值为b的数据结构,10秒后删除)

2)set a b

expire a 10

(两种方法都)

键值操作还有很多,相对比较简单,简单提及其大致用途。如毫秒超时(px、pexpire)、键值移库操作(move)、设置指定时间戳(expireat)、过期时间查询(ttl)、重命名(rename)等,获取键值对(get),直通车:redis命令大全


(2)双向队列

redis的双向队列非常非常类似于python的deque数据结构,其区别仅限于函数名。

Python的deque支持左插入右插入、左提取右提取切片等,而且速度非常快。唯一的缺点:not thread safe!

回到redis,其list操作主要有如下:

1)左(右)插入:lpush(rpush) mylist 1[2,3,'a','-3-'](左(右)插入一个值“1”,当然可以提供多个值)

2)左(右)提取:lpop(rpop) mylist (左(右)提取一个值)

3)阻塞左(右)提取:blpop(brpop) mylist[mylist。。。]  10(左(右)提取一个值,允许阻塞10秒,并允许提取多个list,当一个list超过阻塞时间,会自动切换至设定的下一个list)

4)查询:lrange mylist 1 100 (查询左起第2个至第101至,闭区间)

Tips:redis对list的区间查询跟Python的不一样,Python的区别是左闭右开,redis两边都是闭区间

5)切片(删除):ltrim mylist 0 100(保留左起第1个到第101个)

此外还有一些其他list操作,删除某个特定元素(lrem)、删除并添加(rpoplpush)、详见如上直通车


(3)字典

1)设置键值对:hset mydict a b(添加一个键值对)

2)获取键值对:hget mydict a(获取一个键值对)

3)删除键值对:hdel mydict a[b,c,d](删除一(多)个键值对)

4)获取所有键:hkeys mydict(获取所有mydict里面的键)

5)获取所有值:hvals mydict(获取所有mydict里面的值)

6)获去所有键值对:hgetall myict(获去mydict所有的键值对)

7)自增:hincrby mydict a 1(使一个键的值自增1,有则增无则加键再自增)

8)设置多个键值对:hmset mydict a 1 b 2 c xxx(一次性增加多个键值对)

此外还有一些其他dict操作,如:获取字段个数(hlen mydict)、查询是否存在(hexists mydict keyname)


(4)集合

1)增加元素:sadd myset a[b,c,d](增加一(多)个元素)

2)判断元素是否属于集合:sismenber myset a(判断a是否属于集合myset)

3)查询元素数量:scard myset(查询集合元素的个数)

4)获取所有元素:smembers myset(返回集合所有的元素)

5)移除元素:srem myset a[b,c,d](移除一(多)个元素)

此外还要一些其他set操作,如:差集(sdiff)、交集(sinter)、并集(sunion)、转移(smove)等


下一个章节会分享一下redis在python里面的使用方法。