标签 - 数据结构

Redis 数据结构    2019-05-31 14:31:53    42    0    0

Redis 中有 5 种数据结构,分别是字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set),因为使用 Redis 场景的开发中肯定是无法避开这些基础结构的,所以熟练掌握它们也就成了一项必不可少的能力。本文章精要地介绍了 Redis 的这几种数据结构,主要覆盖了它们各自的定义、基本用法与相关要点。

字符串类型
字符串是 Redis 中的最基础的数据结构,我们保存到 Redis 中的 key,也就是键,就是字符串结构的。除此之外,Redis 中其它数据结构也是在字符串的基础上设计的,可见字符串结构对于 Redis 是多么重要。

Redis 中的字符串结构可以保存多种数据类型,如:简单的字符串、JSON、XML、二进制等,但有一点要特别注意:在 Redis 中字符串类型的值最大只能保存 512 MB。
9d94a6f5cd537c9e3a41e6d5fb2f034cf48.jpg

命令
下面通过命令了解一下对字符串类型的操作:

1.设置值
set key value [EX seconds] [PX milliseconds] [NX|XX]
175df8d857b5f3228122aa6b93da54cd072.jpg

set 命令有几个非必须的选项,下面我们看一下它们的具体说明:

*EX seconds:为键设置秒级过期时间
*PX milliseconds:为键设置毫秒级过期时间
*NX:键必须不存在,才可以设置成功,用于添加
*XX:键必须存在,才可以设置成功,用于更新
5389e90321fccd91581b60c8abd3cb98cd7.jpg

set 命令带上可选参数 NX 和 XX 在实际开发中的作用与 setnx 和 setxx 命令相同。我们知道 setnx 命令只有当 key 不存在的时候才能设置成功,换句话说,也就是同一个 key 在执行 setnx 命令时,只能成功一次,并且由于 Redis 的单线程命令处理机制,即使多个客户端同时执行 setnx 命令,也只有一个客户端执行成功。所以,基于 setnx 这种特性,setnx 命令可以作为分布式锁的一种解决方案。

而 setxx 命令则可以在安全性比较高的场景中使用,因为 set 命令执行时,会执行覆盖的操作,而 setxx 在更新 key 时可以确保该 key 已经存在了,所以为了保证 key 中数据类型的正确性,可以使用 setxx 命令。

2.获取值
get key
89dc932f1ad3c0f89c6301fdfcadca294e2.jpg

3.批量设置值
mset key value
181ca0432e5fe529ec58dfad13d75d6d85d.jpg

4.批量获取值
mget key
4c6869d5bfeba305e91575486d32d0c7b20.jpg

如果有些键不存在,那么它的值将为 nil,也就是空,并且返回结果的

数据结构 Trie树    2019-05-05 10:46:12    182    0    0

  Trie树本身就是一个很迷人的数据结构,何况是其改进的方案。

  在本博客中我会从DAT(Double-Array Tire)的原理开始,并结合其源代码对DAT的状态转移过程进行解析。如果因此你能从我的博客中有所收获或启发,It's my pleasure.

 

本文链接:http://blog.csdn.net/lemon_tree12138/article/details/492

数据结构    2019-05-05 10:44:58    28    0    0

概述:
  说来也奇怪,最近碰到的很多问题都需要用字典树来解决,索性就来研究一番。在这篇博客中,我会通过一些实例来讲解一下字典树的一些基本使用。例如:创建、添加、查找、按字典序排序、按数值大小进行排序(对于一些数值序列的排序)等等。

 

关于字典的实际应用实例,请参见本人的另一篇博客:《算法:两种对拼音进行智能切分的方法》

 

本文链接:http://blog.csdn.net/lemon_tree12138/article/details/49177509 -- 编程小笙
                                                                 --转载请注明出处

 

基本使用:
0.要点说明:
  为了便于以下对字典树的说明,我这里的节点Node可能会有一些对于读者而并不必要的成员。例如,fre, visited, minLength, prefixCount等等。这里读者可以根据自己的需求自行增减。


String name; // 结点的字符名称
int fre; // 单词的词频
boolean end; // 是否是单词结尾
boolean root; // 是否是根结点
Node[] children; // 子节点信息
boolean visited; // 是否已经遍历过了
int minLength; // 通过该节点的最小的数字长度
int prefixCount = 0; // 有多少单词通过这个节点,即节点字符出现的次数
Node parent; // 当前节点的父节点

1.创建一棵新的字典树
  对于创建一棵空的字典树,其实相对来说是比较容易的。因为,我们不需要对树进行一些元素新增或是移除。我们只是对字典树中的一些必要的成员进行了一些初始化的工作。下面是代码部分:


Node root;
int depth;
public TrieTree(String name) {
root = new Node(name);
root.setFre(0);
depth = 0;
root.setEnd(false);
root.setRoot(true);
}

2.插入一个新的节点元素
  对于在字典树的新增元素的关键地方,应该就是我们要在何是停止,即新增完成的条件是什么?

  我们元素新增完成的条件是,我们在对新增的元素(如:"