初识 Redis(1)

初识 Redis

浏览目录

什么是Redis?

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

用于操作内存的软件。 

redis是一个软件,帮助开发者对一台机器的内存进行操作。

要与mysql区分开。

mysql是一个软件,帮助开发者对一台机器的硬盘进行操作。

Redis的特点

  • 可以做持久化
    • AOF
    • RDB
  • 相当于是大字典
  • 单进程单线程
  • 五大数据类型

1

2

3

4

5

6

7

redis={

    k1:'123',  字符串

    k2:[1,2,3,4,4,2,1], 列表

    k3:{1,2,3,4}, 集合

    k4:{name:123,age:666}, 字典

    k5:{('alex',60),('eva-j',80),('rt',70),},有序集合

}

Redis安装和基本使用:

下载安装包

1

wget http://download.redis.io/releases/redis-3.0.6.tar.gz  

解压及安装

1

2

3

tar xzf redis-3.0.6.tar.gz

cd redis-3.0.6

make  

启动服务端

1

2

cd redis-4.0.6

redis-server ./redis.conf  

启动客户端

1

2

3

4

5

src/redis-cli

redis> set foo bar

OK

redis> get foo

"bar"

记得关闭防火墙

1

2

3

firewall-cmd --state  # 查看防火墙 (关闭后显示not running,开启后显示running)

systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

python连接redis的模块  

在终端输入:

1

pip3 install redis

API使用

redis-py 的API的使用可以分类为:

  • 连接方式
  • 连接池
  • 操作
    • String 操作
    • Hash 操作
    • List 操作
    • Set 操作
    • Sort Set 操作
  • 管道
  • 发布订阅

1、操作模式

redis-py提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py。

1

2

3

4

5

6

7

8

#!/usr/bin/env python

# -*- coding:utf-8 -*-

  

import redis

  

= redis.Redis(host='10.211.55.4', port=6379)

r.set('foo''Bar')

print r.get('foo')

2、连接池

redis-py使用connection pool来管理对一个redis server的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数Redis,这样就可以实现多个Redis实例共享一个连接池。

本质:维护一个已经和服务端连接成功的socket。以后再次发送数据时,直接获取一个socket,直接send数据。

1

2

3

4

5

6

7

8

9

10

#!/usr/bin/env python

# -*- coding:utf-8 -*-

  

import redis

  

pool = redis.ConnectionPool(host='10.211.55.4', port=6379)

  

= redis.Redis(connection_pool=pool)

r.set('foo''Bar')

print r.get('foo')

3、操作  

string操作  

redis中的String在在内存中按照一个name对应一个value来存储。如图:

 set(name, value, ex=None, px=None, nx=False, xx=False) 

1

2

3

4

5

6

在Redis中设置值,默认,不存在则创建,存在则修改

参数:

     ex,过期时间(秒)

     px,过期时间(毫秒)

     nx,如果设置为True,则只有name不存在时,当前set操作才执行

     xx,如果设置为True,则只有name存在时,岗前set操作才执行

setnx(name, value) 

1

设置值,只有name不存在时,执行设置操作(添加)

setex(name, value, time)   

1

2

3

# 设置值

# 参数:

    # time,过期时间(数字秒 或 timedelta对象)

psetex(name, time_ms, value) 

1

2

3

# 设置值

# 参数:

    # time_ms,过期时间(数字毫秒 或 timedelta对象)

mset(*args, **kwargs) 

1

2

3

4

5

批量设置值

如:

    mset(k1='v1', k2='v2')

    

    mget({'k1''v1''k2''v2'})  

Hash操作 

redis中Hash在内存中的存储格式如下图:

hset(name, key, value)

1

2

3

4

5

6

7

8

9

# name对应的hash中设置一个键值对(不存在,则创建;否则,修改)

  

# 参数:

    # name,redis的name

    # key,name对应的hash中的key

    # value,name对应的hash中的value

  

# 注:

    # hsetnx(name, key, value),当name对应的hash中不存在当前key时则创建(相当于添加)

hmset(name, mapping)  

1

2

3

4

5

6

7

8

# 在name对应的hash中批量设置键值对

  

# 参数:

    # name,redis的name

    # mapping,字典,如:{'k1':'v1', 'k2': 'v2'}

  

# 如:

    # r.hmset('xx', {'k1':'v1', 'k2': 'v2'})

hget(name,key)  

1

# 在name对应的hash中获取根据key获取value

hmget(name, keys, *args)  

1

2

3

4

5

6

7

8

9

10

11

# 在name对应的hash中获取多个key的值

  

# 参数:

    # name,reids对应的name

    # keys,要获取key集合,如:['k1', 'k2', 'k3']

    # *args,要获取的key,如:k1,k2,k3

  

# 如:

    # r.mget('xx', ['k1', 'k2'])

    # 或

    # print r.hmget('xx', 'k1', 'k2')

hgetall(name)  

1

获取name对应hash的所有键值

hlen(name) 

1

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

hkeys(name)  

1

# 获取name对应的hash中所有的key的值

hvals(name)  

1

# 获取name对应的hash中所有的value的值

hexists(name, key)  

1

# 检查name对应的hash是否存在当前传入的key

hdel(name,*keys)  

1

# 将name对应的hash中指定key的键值对删除

hincrby(name, key, amount=1)  

1

2

3

4

5

# 自增name对应的hash中的指定key的值,不存在则创建key=amount

# 参数:

    # name,redis中的name

    # key, hash对应的key

    # amount,自增数(整数)

hincrbyfloat(name, key, amount=1.0)  

1

2

3

4

5

6

7

8

# 自增name对应的hash中的指定key的值,不存在则创建key=amount

  

# 参数:

    # name,redis中的name

    # key, hash对应的key

    # amount,自增数(浮点数)

  

# 自增name对应的hash中的指定key的值,不存在则创建key=amount

hscan(name, cursor=0, match=None, count=None)  

1

2

3

4

5

6

7

8

9

10

11

12

13

# 增量式迭代获取,对于数据大的数据非常有用,hscan可以实现分片的获取数据,并非一次性将数据全部获取完,从而放置内存被撑爆

  

# 参数:

    # name,redis的name

    # cursor,游标(基于游标分批取获取数据)

    # match,匹配指定key,默认None 表示所有的key

    # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数

  

# 如:

    # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None)

    # 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None)

    # ...

    # 直到返回值cursor的值为0时,表示数据已经通过分片获取完毕

hscan_iter(name, match=None, count=None)  

1

2

3

4

5

6

7

8

9

# 利用yield封装hscan创建生成器,实现分批去redis中获取数据

  

# 参数:

    # match,匹配指定key,默认None 表示所有的key

    # count,每次分片最少获取个数,默认None表示采用Redis的默认分片个数

  

# 如:

    # for item in r.hscan_iter('xx'):

    #     print item

使用字典:
- 基本操作
- 慎重使用hgetall, 优先使用 hscan_iter
- 计数器

注意事项:redis操作时,只有第一层value支持:list,dict ....

List操作  

redis中的List在在内存中按照一个name对应一个List来存储。如图:

lpush(name,values)

1

2

3

4

5

6

7

8

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

  

# 如:

    # r.lpush('oo', 11,22,33)

    # 保存顺序为: 33,22,11

  

# 扩展:

    # rpush(name, values) 表示从右向左操作

lpushx(name,value)  

1

2

3

4

# 在name对应的list中添加元素,只有name已经存在时,值添加到列表的最左边

  

# 更多:

    # rpushx(name, value) 表示从右向左操作

llen(name)  

1

# name对应的list元素的个数

linsert(name, where, refvalue, value))  

1

2

3

4

5

6

7

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

  

# 参数:

    # name,redis的name

    # where,BEFORE或AFTER

    # refvalue,标杆值,即:在它前后插入数据

    # value,要插入的数据

r.lset(name, index, value)  

1

2

3

4

5

6

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

  

# 参数:

    # name,redis的name

    # index,list的索引位置

    # value,要设置的值

r.lrem(name, value, num)  

1

2

3

4

5

6

7

8

# 在name对应的list中删除指定的值

  

# 参数:

    # name,redis的name

    # value,要删除的值

    # num,  num=0,删除列表中所有的指定值;

           # num=2,从前到后,删除2个;

           # num=-2,从后向前,删除2个

lpop(name)  

1

2

3

4

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

  

# 更多:

    # rpop(name) 表示从右向左操作

lindex(name, index)  

1

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

lrange(name, start, end)  

1

2

3

4

5

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

# 参数:

    # name,redis的name

    # start,索引的起始位置

    # end,索引结束位置

ltrim(name, start, end)  

1

2

3

4

5

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

# 参数:

    # name,redis的name

    # start,索引的起始位置

    # end,索引结束位置

rpoplpush(src, dst)  

1

2

3

4

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

# 参数:

    # src,要取数据的列表的name

    # dst,要添加数据的列表的name

blpop(keys, timeout)  

1

2

3

4

5

6

7

8

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

  

# 参数:

    # keys,redis的name的集合

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

  

# 更多:

    # r.brpop(keys, timeout),从右向左获取数据

brpoplpush(src, dst, timeout=0)  

1

2

3

4

5

6

# 从一个列表的右侧移除一个元素并将其添加到另一个列表的左侧

  

# 参数:

    # src,取出并要移除元素的列表对应的name

    # dst,要插入元素的列表对应的name

    # timeout,当src对应的列表中没有数据时,阻塞等待其有数据的超时时间(秒),0 表示永远阻塞

自定义增量迭代  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# 由于redis类库中没有提供对列表元素的增量迭代,如果想要循环name对应的列表的所有元素,那么就需要:

    # 1、获取name对应的所有列表

    # 2、循环列表

# 但是,如果列表非常大,那么就有可能在第一步时就将程序的内容撑爆,所有有必要自定义一个增量迭代的功能:

  

def list_iter(name):

    """

    自定义redis列表增量迭代

    :param name: redis中的name,即:迭代name对应的列表

    :return: yield 返回 列表元素

    """

    list_count = r.llen(name)

    for index in xrange(list_count):

        yield r.lindex(name, index)

  

# 使用

for item in list_iter('pp'):

    print item

分类: redis

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率与经济效益,同兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网与交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟与拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理与迭代收敛过程,以便在实际项目中灵活应用与改进。
### Redis 入门教程初学者指南 Redis 是一种高性能的键值对存储系统,广泛应用于缓存、消息队列以及实数据分析等领域。作为一种开源软件,Redis 支持多种数据结构操作并提供丰富的功能特性。 #### 1. Redis 的基本概念 Redis 不仅是一个简单的键值存储工具,还提供了字符串(String)、哈希(Hash)、列表(List)、集合(Set) 和有序集合(Sorted Set)等多种复杂的数据结构支持[^2]。这些数据结构使得开发者能够轻松实现各种复杂的业务逻辑需求。 #### 2. 安装与环境配置 为了开始使用 Redis,需要先完成其安装过程。通常情况下,在 Linux 或 macOS 平台上可以通过包管理器快速部署;而在 Windows 上则推荐采用 Docker 方式来运行容器化的 Redis 实例[^3]。 ```bash # 使用 apt-get (适用于 Ubuntu/Debian 系统) sudo apt update && sudo apt install redis-server # 启动服务 redis-server --daemonize yes ``` #### 3. 数据结构解析 以下是几种主要的数据类型及其用途简介: - **字符串(String)**: 存储单个值或者作为计数器使用。 ```lua SET mykey "Hello" GET mykey INCR counter_key ``` - **哈希(Hash)**: 表示对象字段与其对应值得映射关系。 ```lua HMSET user:1000 username "Alice" age 30 HGETALL user:1000 ``` - **列表(List)**: 双端链表形式用于 FIFO/LIFO 队列模拟。 ```lua LPUSH queue item1 RPUSH queue item2 LPOP queue RPOP queue ``` - **集合(Set)& 有序集合(Sorted Set)**: 去重后的无序集合或带分数权重排序版。 ```lua SADD unique_items apple banana orange SMEMBERS unique_items ZADD leaderboard 95 alice 87 bob 76 charlie ZRANGE leaderboard 0 -1 WITHSCORES ``` #### 4. 持久化机制 Redis 提供两种持久化方式——RDB 快照文件和 AOF 日志记录。前者定期保存当前状态至磁盘,后者则是每次写命令追加到日志中以便恢复重新执行所有变更[^2]^。 #### 5. 应用场景举例 一些常见的 Redis 使用场景包括但不限于网站访问统计、会话管理、购物车暂存等功能模块开发过程中发挥重要作用. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值