文章目录
在 Redis 中 , 通过 一个 键 Key , 可以 存储多个值 , 这些值存放在一个 List 列表中 ;
List 列表 是 字符串列表 , 元素类型是 字符串 ;
Redis 中的 List 列表 本质是 双向链表 , 可以将 字符串元素 添加到 列表的头部 或 尾部 ;
列表 对于 两端 的 操作 性能较高 , 对于 通过 索引小标 查询 元素的 性能较低 ;
Redis 中的 List 列表 , 底层由 快速链表 QuickList 实现 ;
快速链表 是 链表 和 压缩列表 结合起来的产物 ;
根据下标获取元素 : 获取从 start 索引开始 , 到 stop 索引结束的元素值 ;
lrange key start stop
如果要 查询 键 对应的 List 列表值 , 使用
lrange key 0 -1
命令即可 ;
代码示例 :
127.0.0.1:6379> lrange name 0 -1
1) "Jerry"
2) "Tom"
3) "abc"
4) "123"
127.0.0.1:6379> lrange name 0 2
1) "Jerry"
2) "Tom"
3) "abc"
127.0.0.1:6379>

执行
lindex key index
命令 , 可以 获取 key 列表 index 索引的值 ;
代码示例 :
127.0.0.1:6379> lrange name 0 -1
1) "Jerry"
2) "Tom"
3) "abc"
127.0.0.1:6379> lindex name 2
"abc"
127.0.0.1:6379>
127.0.0.1:6379>

执行
llen key
命令 , 可以 获取 key 列表 的长度 ;
代码示例 :
127.0.0.1:6379> lrange name 0 -1
1) "Jerry"
2) "Tom"
3) "abc"
127.0.0.1:6379> len name
(error) ERR unknown command 'len'
127.0.0.1:6379>
127.0.0.1:6379> llen name
(integer) 3
127.0.0.1:6379>

插入值 :
lpush key value1 value2 value3 ...
rpush key value1 value2 value3 ...
如果要 查询 键 对应的 List 列表值 , 使用
lrange key 0 -1
命令即可 ;
代码示例 :
127.0.0.1:6379> lpush name Tom Jerry Jack
(integer) 3
127.0.0.1:6379> lrange name 0 -1
1) "Jack"
2) "Jerry"
3) "Tom"
127.0.0.1:6379>
127.0.0.1:6379> rpush name abc 123 456
(integer) 6
127.0.0.1:6379> lrange name 0 -1
1) "Jack"
2) "Jerry"
3) "Tom"
4) "abc"
5) "123"
6) "456"
127.0.0.1:6379>

执行
linsert key before/after value newValue
命令 , 可以 在 key 列表 的 value 值 前面 / 后面 插入新值 newValue ;
代码示例 : 在 age 列表中 , 元素 18 之前 , 插入值 110 ;
127.0.0.1:6379> lrange age 0 -1
1) "123"
2) "18"
3) "17"
4) "16"
127.0.0.1:6379> linsert age before 18 110
(integer) 5
127.0.0.1:6379> lrange age 0 -1
1) "123"
2) "110"
3) "18"
4) "17"
5) "16"
127.0.0.1:6379>

移除值 :
lpop key
rpop key
如果要 查询 键 对应的 List 列表值 , 使用
lrange key 0 -1
命令即可 ;
代码示例 :
127.0.0.1:6379> lrange name 0 -1
1) "Jack"
2) "Jerry"
3) "Tom"
4) "abc"
5) "123"
6) "456"
127.0.0.1:6379>
127.0.0.1:6379> lpop name
"Jack"
127.0.0.1:6379> lrange name 0 -1
1) "Jerry"
2) "Tom"
3) "abc"
4) "123"
5) "456"
127.0.0.1:6379> rpop name
"456"
127.0.0.1:6379> lrange name 0 -1
1) "Jerry"
2) "Tom"
3) "abc"
4) "123"
127.0.0.1:6379>

执行
lrem key n value
命令 , 可以 在 key 列表 中 删除左侧的 n 个 value 值 ;
代码示例 : 在 age 列表中 , 删除左侧的 2 个 18 元素 , 这里只有一个 18 元素 , 直接删除 ;
127.0.0.1:6379> lrange age 0 -1
1) "123"
2) "110"
3) "18"
4) "17"
5) "16"
127.0.0.1:6379>
127.0.0.1:6379> lrem age 2 18
(integer) 1
127.0.0.1:6379> lrange age 0 -1
1) "123"
2) "110"
3) "17"
4) "16"
127.0.0.1:6379>

执行
rpoplpush key1 key2
命令 , 可以 从 key1 列表右边取出一个值 , 放在 key2 列表的左边 ;
代码示例 :
127.0.0.1:6379> lrange age 0 -1
1) "18"
2) "17"
3) "16"
127.0.0.1:6379> lrange name 0 -1
1) "Jerry"
2) "Tom"
3) "abc"
4) "123"
127.0.0.1:6379>
127.0.0.1:6379> rpoplpush name age
"123"
127.0.0.1:6379> lrange age 0 -1
1) "123"
2) "18"
3) "17"
4) "16"
127.0.0.1:6379>

执行
lset key index value
命令 , 可以 在 key 列表 中 将 第 index 索引位置 的 元素 替换为 value 值 ;
代码示例 : 在 age 列表中 , 将第 2 个元素替换成 888 值 ;
127.0.0.1:6379> lrange age 0 -1
1) "123"
2) "110"
3) "17"
4) "16"
127.0.0.1:6379> lset age 2 888
OK
127.0.0.1:6379> lrange age 0 -1
1) "123"
2) "110"
3) "888"
4) "16"
127.0.0.1:6379>

我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge