关于Redis

Redis是非关系型数据库(NoSQL)的一种,区别于关系型数据库。其内部数据间相互独立,性能表现优秀。即使是在大量数据下性能也很好,这都得益于其数据结构简单,数据间相互独立的特性。而这些特性都是关系型数据库所望尘莫及的。

主流的NoSQL产品

NoSQL数据库的四大分类

  • 键值对(Key-Value)存储:Redis
    优:快速查询
    劣:存储的数据缺少结构化
  • 列存储:HBase
    优:快速查询、扩展性强
    劣:功能相对局限
  • 文档数据库:MongoDB
    优:数据结构要求不是很严格
    劣:查询性能不高、缺少统一的查询语法
  • 图形数据库:InfoGrid
    优:利用图结构相关算法
    劣:需要对整个图做计算才能得出结果、不容易做分布式集群方案

NoSQL的特点

易扩展
灵活的数据模型
大数据量、高性能
高可用

Redis的概述

Redis是高性能键值对数据库,支持的键值数据类型有:
字符串类型
列表类型
有序集合类型
散列类型
集合类型

Redis的应用场景

缓存
任务队列
网站访问统计
数据过期处理
应用排行榜
分布式集群架构中的session分离

Redis使用方法

1. 字符串类型

"""
set --设置值,返回True 或者False
get --获取值
mset --设置多个键值对,返回True 或者False
mget --获取多个键值对
append --添加字符串
del --删除,返回删除成功的数据数量
incr/decr -- 增加/减少 1
"""
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import redis
#python 操作str
class TestString(object):def __init__(self):self.r = redis.StrictRedis(host='localhost', port=6379, db=0)def test_set(self):rest = self.r.set('user2', 'Amy')print ( rest)   # 输出 Truereturn restdef test_get(self):rest = self.r.get('user2')print (rest)  # 输出 Amyreturn restdef test_mset(self):"""mset --设置多个键值对:return:"""d = {'user1': 'XH','user3': 'Bob','user4': 'Bobx'}rest = self.r.mset(d)print (rest)  # 输出 Truereturn restdef test_mget(self):"""mget --获取多个键值对:return:"""l = ['user1','user2','user3','user4','user6']rest = self.r.mget(l)print (rset)    # 输出[ b'XH', b'Amy', b'Bob', b'Bobx', None]return restdef test_del(self):"""del 删除:return:"""rest = self.r.delete('user1')print (rest)   #输出1 return restdef main():str_obj = TestString()str_obj.test_set()str_obj.test_get()str_obj.test_mset()str_obj.test_mget()str_obj.test_del()if __name__ == '__main__':main()

2. 列表

class TestList(object):"""lpush/rpush --从左/右插入数据,返回插入成功的数据下标,列表的每个数据格式可以不一样,每push一次下标加1["1",""2,3,4",("safa"),{"name":"yangxiaoru"}]lrange(开始下标,结束下标) -- 获取指定长度的数据,获取完了之后列表中还有数据ltrim -- 截取一定长度的数据lpop/rpop -- 移除最左/右的元素并返回lpushx/rpushx -- key存在的时候才插入数据,不存在不做任何处理"""def __init__(self):self.r = redis.StrictRedis(host='localhost', port=6379, db=0)def test_push(self):"""lpush/rpush --从左/右插入数据lrange -- 获取指定长度的数据:return:"""t = ('Amy', 'Jhon')reset = self.r.lpush('l_eat2', *t)print (reset) #输出2(2是起始下标)reset = self.r.lrange('l_eat2', 0, -1) #获取第一位到倒数第一位直接的数据(左右闭区间)print (reset) #输出 [b'Jhon', b'Amy'],左边插入,左边取出,所以倒序了def test_pop(self):"""lpop/rpop -- 移除最左/右的元素并返回:return:"""rest = self.r.lpop('l_eat2') #从左边弹出一个数据print (rest) #输出 b'Jhon'reset = self.r.lrange('l_eat2', 0, -1)print (reset) # 输出 [b'Amy']def main():# listlist_obj = TestList()list_obj.test_push()list_obj.test_pop()if __name__ == '__main__':main()

注意事项
举个栗子:当前有名字叫my_list的Redis列表如下:[0,1,2,3,4,5]
1、lrange(start,end),下标可以正向取,也可以负向取。但是参数中必须是start<=end。
lrange(2,2) #返回2
lrange(-4,-4) #返回2
lrange(1,2) #返回1,2
lrange(2,-2) #返回2,3,4
lrange(-3,-2) #返回3,4
以下方式都是取不到数据的:
lrange(2,1) #返回空
lrange(-2,-3) #返回空

2、Redis的列表下标溢出之后不会报错,她只取尽量多的数据即可
redis.lrange(6,7) #需要取下标为6和7的数据 ,结果返回空。
redis.lrange(5,7) #需要取下标为5,6,7的数据 ,结果返回[5]

3. 集合

class TestSet(Base):"""sadd/srem --添加/删除元素sismember --判断是否为set的一个元素smembers --返回该集合的所有成员sdiff --返回一个集合与其他集合的差异sinter --返回几个集合的交集sunion --返回几个集合的并集"""def __init__(self):self.r = redis.StrictRedis(host='172.17.20.144', port=6379, db=0)def test_sadd(self):"""sadd/srem --添加/删除元素:return:"""l = ['Cats', 'Dogs']rest = self.r.sadd('zoo3', *l) print (rest) #输出2rest = self.r.smembers('zoo3') print (rest) #输出 {b'Dogs', b'Cats'}def test_srem(self):"""sadd/srem --添加/删除元素:return:"""rest = self.r.srem('zoo2','Dogs') #没有名字为“zoo2”的集合print (rest) #输出0rest = self.r.smembers('zoo2')print (rest) #输出 set(),即空集合def test_sinter(self):"""sinter --返回几个集合对象的交集sunion --返回几个集合对象的并集:return:"""rest = self.r.sunion('zoo2', 'zoo3')print (rest) #输出 {b'Dogs', b'Cats'}rest = self.r.sinter('zoo2','zoo3')print (rest) #输出set(),即空集合def main():test_obj = TestSet()test_obj.test_sadd()test_obj.test_srem()test_obj.test_sinter()if __name__ == '__main__':main()

4. 散列

class TestHash(Base):"""hset/hget --设置/获取散列值hmset/hmget --设置/获取多对散列值hsetnx --如果散列已经存在,则不设置hkeys/hvals --返回所有Keys/Valueshlen -- 返回散列包含域"""def test_set(self):"""hset/hget --设置/获取散列值:return:"""reset = self.r.hset('stu:xxx01','name','Amy')print (reset) #输出1,再次执行的话输出0reset = self.r.hexists('stu:xxx01','name')print (reset) #输出Truereset = self.r.hget('stu:xxx01','name')print (reset)#输出 b'Amy'def test_mset(self):"""hmset/hmget --设置/获取多对散列值:return:"""m = {'name':'Bob','age':21,'grade':98}rest = self.r.hmset('stu:xxx03',m)print (rest) #输出truerest = self.r.hkeys('stu:xxx03')print (rest) #输出 [b'name', b'age', b'grade']def main():hash_obj = TestHash()hash_obj.test_set()hash_obj.test_mset()if __name__ == '__main__':main()

Redis入门-基础键值对、list、set、hashlist基础操作相关推荐

  1. linux创建redis容器,docker-compose实现redis部署及键值添加

    为了简化部署过程,减少手工操作,研究出使用docker-compose方式实现redis部署并往该redis中添加键值 以下为我编写的docker-compose.yml文件的内容 #vi /opt/ ...

  2. Redis中的键值过期操作

    1.过期设置 Redis 中设置过期时间主要通过以下四种方式: expire key seconds:设置 key 在 n 秒后过期: pexpire key milliseconds:设置 key ...

  3. 你说,Redis如何实现键值自动清理?

    Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制. 大家都知道,Redi ...

  4. 深入探索Redis:高性能键值存储数据库

    系列文章目录 文章目录 系列文章目录 前言 一.Redis简介 1.1 为什么需要Redis 1.1.1 高性能 1.1.2 高并发 1.2 Redis的应用场景 二.Redis 下载安装 2.1 w ...

  5. 浅谈redis数据库的键值设计

    丰富的数据结构使得redis的设计非常的有趣.不像关系型数据库那样,DEV和DBA需要深度沟通,review每行sql语句,也不像memcached那样,不需要DBA的参与.redis的DBA需要熟悉 ...

  6. Spark 的键值对(pair RDD)操作,Scala实现

    一:什么是Pair RDD? Spark为包含键值对对类型的RDD提供了一些专有操作,这些操作就被称为Pair RDD,Pair RDD是很多程序的构成要素,因为它们提供了并行操作对各个键或跨节点重新 ...

  7. python方向键键值_Python实现的字典排序操作示例【按键名key与键值value排序】

    本文实例讲述了Python实现的字典排序操作.分享给大家供大家参考,具体如下: 对字典进行排序?这其实是一个伪命题,搞清楚python字典的定义---字典本身默认以key的字符顺序输出显示---就像我 ...

  8. python读取配置文件获取所有键值对_Python读取properties配置文件操作示例

    本文实例讲述了Python读取properties配置文件操作.分享给大家供大家参考,具体如下: 工作需要将Java项目的逻辑改为python执行,Java的很多配置文件都是.properties的, ...

  9. redis专题:redis键值设计、性能优化以及redis连接池配置

    文章目录 1.redis键值设计 ①:key设计规范 ②:value设计规范 2. 命令使用优化 3. redis连接池配置参数设计 4. redis连接池预热 5. redis的key过期删除策略 ...

最新文章

  1. 武汉东方7神话服饰有限公司
  2. [Lintcode]41. Maximum Subarray/[Leetcode]53. Maximum Subarray
  3. C语言 十进制整数字符串转十六进制字符串
  4. Linux中常见目录的作用
  5. 求方程的解 Solve the Equation
  6. Windows编译libcaffe时报cudnn.hpp(114): too few arguments in function call错误
  7. [论文阅读] Learning a Unified Classifier Incrementally via Rebalancing
  8. 如何对xgboost模型进行优化
  9. HTML小游戏7 —— 《罗斯魔影》魔法消除游戏(附完整源码)
  10. 一些常用的Maven命令的作用
  11. C语言三种形式编九九乘法表,C语言九九乘法表(五种输出形式)
  12. Python爬虫实战,pymysql模块,Python实现抓取QQ音乐评论
  13. 使用aria2搭建离线下载服务器
  14. HtmlUnit、Jsoup、webmagic基本介绍
  15. 前端学习第三章——a标签(超链接)
  16. 五子棋(C++面向对象实现)
  17. 为什么iPhone手机微信信息老是出现延误?原来是这5大原因搞的鬼
  18. 吉林大学珠海学院论坛 http://j.bnubbs.cn
  19. Pandas中loc和iloc函数的用法
  20. 手机刷机后数据还在吗?手机刷机并保留数据的方法

热门文章

  1. 近代中国的三次思想文化运动
  2. 区块链+金融崛起 京东金融研究院发布区块链金融应用白皮书
  3. 《程序员羊皮卷》荣升当当IT图书飙升榜第一名
  4. MATLAB常用技巧之复数判断,矩阵中空值判断,空矩阵判断
  5. 玩游戏的时候计算机弹出,电脑玩游戏时总是弹出输入法怎么办?
  6. 华为机试在线训练--牛客网(python)第四部分
  7. ie下ajax请求不到数据库,解决IE下Ajax请求无效
  8. UE4中灯光和天空大气的设置说明
  9. 一篇文章教会你利用Python网络爬虫获取穷游攻略
  10. mw325r设置虚拟服务器,水星MW325R无线桥接设置教程 | 192路由网