
本期与大家分享的是,小北用心整理的
Redis数据库从入门到精通详细介绍,希望对大家能有帮助,大家喜欢就给点鼓励吧,欢迎各位大佬评论区指教讨论!💜🧡💛制作不易,各位大佬们给点鼓励!
🧡💛💚点赞👍 ➕ 收藏⭐ ➕ 关注✅
💛💚💙欢迎各位大佬指教,一键三连走起!
一、常见的非关系型数据库NOSQL分类
二、了解Redis
三、Redis的单节点安装教程
四、Redis的常用命令
1、Help帮助命令
2、SET命令
3、过期命令
4、查找键命令
5、操作键命令
6、GET命令
7、步长命令
8、登录不同的库命令
9、清除当前库数据命令
10、清除所有库中的数据命令
五、BITMAP位图
1、位图常用命令
2、位操作命令
3、统计指定位区间上值为1的个数
六、Redis的数据模型
1、Redis的 key 键
2、Redis的 Value 值
1、String字符串
2、 List列表
3、 Hash散列
4、Set集合
5、SortedSet有序集合
七、Redis持久化
1、Redis持久化-RDB
(1)RDB使用策略
(2)SAVE命令
(3)BGSAVE命令
(4)SAVE 和 BGSAVE 命令的区别
(5)RDB持久化的优缺点
2、Redis持久化-AOF
(1)AOF写入机制
(2) 写入磁盘的策略
(3)AOF重写机制
(4)AOF重写触发
(5)AOF持久化的优缺点
八、idea使用Jedis连接Redis
| NOSQL类型 | 主要数据库产品 | 类型特色 |
|---|---|---|
| K-V键值对存储类型 | Redis、Memcached | 使用key可以快速的查询到value,Memcached可以支持String类型的值value,Redis支持的值的数据类型很多如:String\set\hash\sortset\list等等 |
| 文档存储类型 | MongoDB、CouchDB | 使用JSON或类JSON的BSON数据结构,存储的内容为文档型,能够实现部分关系型数据库的功能 |
| 列存储类型 | HBase、Cassandra | 按照列进行数据存储,该类型便于存储结构化和半结构化的数据,可以方便做数据压缩和针对某一列或者某几列的数据查询 |
| 图存储类型 | Neo4J、FlockDB | 以图形关系存储数据,能够很好的弥补关系型数据库在图形存储时的不足 |
| 对象存储类型 | Db4o、Versant | 该存储类型的数据库通过类似面向对象的方式操作数据库,通过对象的方式存取数据 |
| XML存储类型 | Berkeley DB XML、BaseX | 该类型数据库可以高效的存储XML数据,并且支持XML的内部查询语法,例如;XQuery、XPath |
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的(BSD协议)使用ANSI C语言编写,基于内存的且支持持久化,高性能的Key-Value的NOSQL数据库;Redis支持的数据结构类型很丰富,如 :字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 以及范围查询, bitmaps(位图), hyperloglogs (超级日志)和 地理空间(geospatial) 索引半径查询等等。并且Redis有着丰富的支持主流语言的客户端,C/C++、Python、Erlang、R、C#、Java、PHP、Objective-C、Perl、Ruby、Scala、Go、JavaScript等;Redis 内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久化,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性;我们可以将Redis应用在缓存(StackOverFlow)、数据库、消息中间件等上。
Redis官网链接: https://redis.io/
安装准备:Linux虚拟机:CentOS7、操作工具:Xshell 、Xftp
Redis安装包下载地址:https://download.redis.io/releases/
下载配置文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
生成缓存
yum makecache
1、因为Redis是使用ANSI C语言编写的,所以我们要先安装gcc依赖
yum install -y gcc-c++ gcc tcl
2、使用Xftp上传Redis压缩的安装包到Linux虚拟机并解压
上传的压缩包的路径,可以自己指定或创建上传的目录
小北是上传到了/usr/local/module/目录,然后解压到了/usr/local/soft/目录下
tar -xvf redis-3.0.0.tar.gz

3、进入解压好的目录redis-3.0.0,编译make
cd redis-3.0.0
make

下面shell命令是用于测试make的,可用可不用
make test
创建安装目录
这是小北的安装目录
mkdir -p /usr/local/soft/redis
安装
make PREFIX=/usr/local/soft/redis install

4、复制配置文件
cp /usr/local/soft/redis-3.0.0/redis.conf /usr/local/soft/redis/bin/
配置环境变量
vim /etc/profile
添加环境变量
export REDIS_HOME=/usr/local/soft/redis/
export PATH=$REDIS_HOME/bin
让环境变量修改生效
source /etc/profile
5、启动Redis
后台启动
cd /usr/local/soft/redis/bin
nohup redis-server redis.conf &

关闭redis的命令,要先获取Redis的进程号,杀死该进程
ps -aux | grep redis
kill -9
6、连接Redis
查看启动日志:
cat nohup.out

后台启动Redis
redis-cli

7、测试使用Redis
插入一条数据
set key1 value1
查询数据
get key1


(1)设置字符串值
命令使用格式:
SET key value [EX seconds] [PX milliseconds] [NX|XX]
注意:
EX 表示设置过期时间,单位:秒,等同于SETEX key seconds value
PX 表示设置过期时间,单位:毫秒,等同于PSETEX key milliseconds value
NX 表示键不存在,才能设置,等同于SETNX key value
XX 表示键存在时,才能设置
(2)设置多个键的字符串值
使用格式:
MSET key value [key value ...]
(3)当键不存在时,设置字符串值
MSETNX key value [key value ...]
注意:这是原子操作

Redis中可以给Key设置一个生存时间(秒或毫秒),当达到这个时长后,这些键值将会被自动删除。
(1)设置多少秒或者毫秒后过期
EXPIRE key seconds
PEXPIRE key milliseconds
(2)设置在指定Unix时间戳过期
EXPIREAT key timestamp
PEXPIREAT key milliseconds-timestamp
(3)删除过期
PERSIST key
(4)生存时间
Time To Live,指Key的剩余生存时间
(5)查看剩余生存时间
TTL key
PTTL key
key存在但没有设置TTL,返回-1
key存在,但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)

(1)查找键使用格式:
KEYS pattern
(2)pattern的取值
* 任意长度字符
? 任意一个字符
[] 字符集合,表示可以是集合中的任意一个

(1)查看键的数据类型
TYPE key
(2)判断键是否存在
EXISTS key
(3)给键重命名
RENAME key newkey
RENAMENX key newkey 若键存在就rename
(4)删除键
DEL key [key ...]

(1)获取值
GET key
(2)获取多个给定的键的值
MGET key [key ...]
(3)返回旧值并设置新值
GETSET key value 如果键不存在,就创建并赋值
(4)获取字符串长度
STRLEN key
(5)追加字符串
APPEND key value
如果键存在就追加;如果不存在就等同于SET key value
(6)获取子字符串
GETRANGE key start end
索引值从0开始,负数表示从字符串右边向左数起,-1表示最有一个字符
(7)覆盖字符串
SETRANGE key offset value

注意:只能对整形的数据进行步长操作
(1)步长1的增减
INCR key
DECR key
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串
(2)步长增减,指定步长长度
INCRBY key decrement
DECRBY key decrement
字符串值会被解释成64位有符号的十进制整数来操作,结果依然转成字符串

redis-cli --help
redis-cli -n 2
FLUSHDB
FLUSHALL
位图不是真正的数据类型,它是定义在字符串类型中的,我们知道一个字符串类型的值最多能存储512M字节的内容,其中位上限:2^(9+10+10+3) =2^32b
(1)设置某一位上的值
SETBIT key offset value
offset偏移量,从0开始
value不写,默认是0
(2)获取某一位上的值
GETBIT key offset
(3)返回指定值0或者1在指定区间上第一次出现的位置
BITPOS key bit [start] [end]


对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 dteskey 上
已知a和b的二进制表示:
a = 01100001
b = 01100010
都为1才为1
AND=》求逻辑并(与) 1 and 1->1 0 and 0->0 1 and 0->0
bitop and aband a b
有一个为1就为1
OR=》求逻辑或 1 or 1->1 0 or 0->0 1 or 0->1
bitop or abor a b
就是取反(反转)
NOT=》求逻辑非 not 0 ->1 not 1->0
bitop not anot a
bitop not bnot b
相同为0,相异为1
XOR=》求逻辑异或 0 xor 0->0 1 xor 1->0 1 xor 0->1
bitop xor abxor a b
使用格式1:
BITCOUNT key [start] [end]
从左向右从0开始,从右向左从-1开始,
注意:官方start、end是位,测试后是字节
使用格式2:
BITCOUNT testkey 0 0
表示从索引为0个字节到索引为0个字节,也就是指对第一个字节的统计
注意:
BITCOUNT testkey 0 -1 等同于BITCOUNT testkey
我们最常用的格式就是 BITCOUNT testkey


Redis的 key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。
Key取值原则:
字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据;并且一个字符串类型的值最多能存储512M字节的内容。
List列表是基于Linked List实现的,列表中的元素是字符串类型;而列表的头尾增删速度快,中间增删速度慢,正常使用过程中增删元素是常态,列表中元素可以重复出现,并且列表中最多能包含2^32-1个元素;列表的索引,从左至右,从0开始;从右至左,从-1开始
(1)注意:
命令说明:
B --》block 块,阻塞
L --》left 左
R --》right 右
X --》exist 存在
(2)左右(或者头尾)压入元素
左(头)压入元素:
格式: LPUSH key value [value ...]
举例: LPUSHX key value
左(头)压入元素:
格式:RPUSH key value [value ...]
举例:RPUSHX key value

(3)左右(或者头尾)弹出元素(取出元素后,原先的位置就没有了)
LPOP key
RPOP key
(4)从一个列表尾部弹出元素压入到另一个列表的头部
RPOPLPUSH source destination
(5)返回列表中指定范围元素(返回元素后,原先的位置还有)
LRANGE key start stop
LRANGE key 0 -1 表示返回所有元素
(6)获取指定位置的元素
LINDEX key index
(7)设置指定位置元素的值
LSET key index value
(8)获取列表长度(元素个数)
LLEN key
(9)从列表头部开始删除值等于value的元素count次
LREM key count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值
(10)去除指定范围外元素
LTRIM key start stop
(11)在列表中某个存在的值(pivot)前或后插入元素
LINSERT key BEFORE|AFTER pivot value
若key和pivot不存在,则不进行任何操作
(12)阻塞
如果弹出的列表不存在或者为空,就会造成阻塞
若超时时间设置为0,就是永久阻塞,直到有数据可以弹出
如果多个客户端阻塞在同一个列表上,那么使用First In First Service原则,先到先服务
(13)左右(或者头尾)阻塞弹出元素
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
(14)从一个列表尾部阻塞弹出元素压入到另一个列表的头部
BRPOPLPUSH source destination timeout
Hash散列是由field和关联的value组成的map键值对,而field和value都是字符串类型,一个hash中最多包含2^32-1键值对。
(1)设置单个字段
HSET key field value
HSETNX key field value
当在key的filed不存在的情况下执行,那么key不存在会直接创建
(2)设置多个字段
HMSET key field value [field value ...]
(3)返回字段个数
HLEN key
(4)判断字段是否存在
HEXISTS key field
key或者field不存在,返回0
(5)返回字段值
HGET key field
(6)返回多个字段值
HMGET key field [field ...]
(7)返回所有的键值对
HGETALL key
(8)返回所有字段名
HKEYS key
(9)返回所有值
HVALS key
(10)在字段对应的值上进行整数的增量计算
HINCRBY key field increment
(11)在字段对应的值上进行浮点数的增量计算
HINCRBYFLOAT key field increment
(12)删除指定的字段
HDEL key field [field ...]
1).使用Hash的优点
2).不适合使用Hash的情况
Set集合内存储的元素是无序的、去重的,元素是字符串类型,最多包含2^32-1个元素
(1)增加一个或多个元素
SADD key member [member ...]
如果元素已经存在,则自动忽略
(2)移除一个或者多个元素
SREM key member [member ...]
元素不存在,自动忽略
(3)返回集合包含的所有元素
SMEMBERS key
如果集合元素过多,例如百万个,需要遍历,可能会造成服务器阻塞,生产环境应避免使用
(4)检查给定元素是否存在于集合中
SISMEMBER key member
(5)集合的无序性
SADD friends "java" "hadoop" "tomcat" "hive" "mapreduce" "spark"
SADD anotherfriends "java" "hadoop" "tomcat" "hive" "mapreduce" "spark"
SMEMBERS friends
SMEMBERS anotherfriends
注意:
SMEMBERS 有可能返回不同的结果,
如果需要存储有序且不重复的数据使用有序集合,存储有序可重复的使用列表
(6)随机返回集合中指定个数的
SRANDMEMBER key [count]
如果 count 为正数,且小于集合基数,
那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
如果 count 大于等于集合基数,那么返回整个集合
如果 count 为负数,
那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值
如果 count 为 0,返回空
如果 count 不指定,随机返回一个元素
(7)返回集合中元素的个数
SCARD key
键的结果会保存信息,集合长度就记录在里面,所以不需要遍历
(8)随机从集合中移除并返回这个被移除的元素
SPOP key
(9)把元素从源集合移动到目标集合
SMOVE source destination member
(10)求差集
SDIFF key [key ...],从第一个key的集合中去除其他集合和自己的交集部分
SDIFFSTORE destination key [key ...],将差集结果存储在目标key中
(11)求交集
SINTER key [key ...],取所有集合交集部分
SINTERSTORE destination key [key ...],将交集结果存储在目标key中
(12)求并集
SUNION key [key ...],取所有集合并集
SUNIONSTORE destination key [key ...],将并集结果存储在目标key中
SortedSet有序集合与Set集合类似,它是有序的、去重的,元素是字符串类型,每一个元素都关联着一个浮点数分值(Score),并按照分值从小到大的顺序排列集合中的元素。其分值可以相同;最多包含2^32-1个元素。
(1)增加一个或多个元素
ZADD key score member [score member ...]
如果元素已经存在,则使用新的score
(2)移除一个或者多个元素
ZREM key member [member ...]
元素不存在,自动忽略
(3)显示分值
ZSCORE key member
(4)增加或者减少分值
ZINCRBY key increment member
increment为负数就是减少
(5)返回元素的排名(索引)
ZRANK key member
(6)返回元素的逆序排名
ZREVRANK key member
(7)返回指定索引区间元素
ZRANGE key start stop [WITHSCORES]
如果score相同,则按照字典序lexicographical order 排列
默认按照score从小到大,如果需要score从大到小排列,使用ZREVRANGE
(8)返回指定索引区间元素
ZREVRANGE key start stop [WITHSCORES]
如果score相同,则按照字典序lexicographical order 的 逆序 排列
默认按照score从大到小,如果需要score从小到大排列,使用ZRANGE
(9)返回指定分值区间元素(升序排序)
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回score默认属于[min,max]之间,元素按照score升序排列,若score相同则按照字典排序
LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql
使用小括号,则修改区间为开区间,例如(5、(10、5)
-inf 和 +inf 分别表示负无穷和正无穷
(10)返回指定分值区间元素(降序排序)
ZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回score默认属于[min,max]之间,元素按照score降序排列,score相同字典降序
LIMIT中offset代表跳过多少个元素,count是返回几个。类似于Mysql
使用小括号,修改区间为开区间,例如(5、(10、5)
-inf和+inf表示负无穷和正无穷
(11)移除指定排名范围的元素
ZREMRANGEBYRANK key start stop
(12)移除指定分值范围的元素
ZREMRANGEBYSCORE key min max
(13)返回集合中元素个数
ZCARD key
(14)返回指定范围中元素的个数
ZCOUNT key min max
ZCOUNT fruits 4 7
ZCOUNT fruits (4 7
(15)求并集
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
numkeys必须指定key的数量
WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重
AGGREGATE选项,指定并集结果的聚合方式
SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值
MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值
(16)求交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
numkeys指定key的数量,必须
WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重
AGGREGATE选项,指定并集结果的聚合方式
SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值
MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值
MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值
Redis持久化是指将数据从掉电易失的内存存放到能够永久存储的设备上
Redis持久化两种方式:RDB(Redis DB) 和 AOF(AppendOnlyFile)
在默认情况下,Redis 将数据库快照保存在名字为 dump.rdb的二进制文件中
注意:RDB策略会容易造成数据丢失
在redis 客户端使用 save命令用于将数据持久化的保存到disk(磁盘)中,但执行该命令时会阻塞Redis服务,无法响应客户端请求,也就是在服务器执行save命令期间,Redis服务器不允许执行其它的命令直到save命令执行完,执行save命令会创建新的dump.rdb替代旧文件。
(该命令是在后台执行的,是一个异步命令)
在redis客户端 使用 bgsave命令时,不会阻塞Redis服务,也就是非阻塞,Redis服务正常接收处理客户端请求,并且Redis会folk()一个新的子进程来创建RDB文件,子进程处理完后会向父进程发送一个信号,通知它处理完毕,父进程用新的dump.rdb替代旧文件
优点
缺点
Append only file(AOF),该方式采用追加的方式保存数据,默认保存的文件appendonly.aof;该方式会记录所有的写操作命令,在服务启动的时候使用这些命令就可以还原数据库;调整AOF持久化策略,可以在服务出现故障时,不丢失任何数据,也可以丢失一秒的数据。相对于RDB方式损失要小得多
在redis.conf文件中的appendfsync选项,这个选项的值可以是always、everysec或者no
运行速度:always的速度慢,everysec和no都很快
重写的过程
注意:如果写入操作的时候出现故障导致命令写半截,可以使用redis-check-aof工具修复
举例:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
当AOF文件大于64MB时候,可以考虑重写AOF文件
只有当AOF文件的增量大于起始size的100%时,
也就是文件大小翻了一倍时,启动重写
优点
缺点
首先需要在idea中的maven中的依赖配置文件pom.xml中导入jedis的依赖包,这里北使用的3.0版本的redis,那么导入的jedis依赖也是对应版本的;若是其它版本可以在maven仓库中选择对应版本,链接地址:https://mvnrepository.com/artifact/redis.clients/jedis
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.0.0</version>
</dependency>
idea中建立连接
import redis.clients.jedis.Jedis;
/**
* jdbc:是一种连接关系型数据的规范
* redis: 是kv结构的非关系型数据库(没有sql语句),使用jedis连接
*/
public class jedistest {
public static void main(String[] args) {
//创建redis连接
Jedis jedis = new Jedis("master", 6379);
//获取数据
String name = jedis.get("name");
System.out.println(name);
}
}

我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h