Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the standard way to diagram a redis (key-value) data structure?

I am working on creating a redis (key-value) database, and I want to be able to easily change the diagram which represents how the data should be stored. Included in this diagram I want to be able to distinguish data which is saved as a string of JSON, vs that which is actually a hash table, or a set or an ordered set.

I tried writing something up in excel, but it was too much like a relational database, I tried writing it in JSON but it was hard to tell what was a value of a JSON string, and which were hashes.

Is there an industry standard on how to diagram this?

EDIT: I ended up making my own syntax, but would still like to know the answer to this.

like image 301
Avik Avatar asked Apr 05 '15 10:04

Avik


People also ask

How would you design a Redis key?

While short keys will obviously consume a bit less memory, your job is to find the right balance. Try to stick with a schema. For instance "object-type:id" is a good idea, as in "user:1000". Dots or dashes are often used for multi-word fields, as in "comment:1234:reply.to" or "comment:1234:reply-to".

What is the data structure for Redis?

Redis Bitmaps is a compact data structure to store binary logic and states. It provides commands to fetch and set a bit value at a given position and perform AND, OR, XOR, and NOT binary search operations between multiple bitmap keys.

How does Redis store key-value?

redis is an in-memory, key/value store. Think of it as a dictionary with any number of keys, each of which has a value that can be set or retrieved. However, Redis goes beyond a simple key/value store as it is actually a data structures server, supporting different kinds of values.

Does Redis have table?

In Redis, a table doesn't map to a single structure, but rather a more flexible and precise group of structures.


1 Answers

This is the syntax I created for myself: (And here is a sample Redis structure of a card game I was going to make: http://pastebin.com/4aRye4HQ)

key:   = string
#key:  = hash
$key:  = set
$$key: = sortedSet

This is the Sublime syntax highlighting file I used to color code the syntax (Saved as redis.YAML-tmLanguage ):

    # [PackageDev] target_format: plist, ext: tmLanguage
---
name: Redis
scopeName: source.redis
fileTypes: []
uuid: 0033bdf9-cd9f-4147-bd2e-a9fed3d07e1e

patterns:
- include: '#erb'
- match: \#[A-Za-z][A-Za-z0-9_]+
  name: variable.parameter
  comment: Hashes
- match: \$[A-Za-z][A-Za-z0-9_]+
  name: support.constant
  comment: Sets
- match: \$\$[A-Za-z][A-Za-z0-9_]+
  name: entity.name.class
  comment: Sets
- match: \d+
  name: constant.numeric
  comment: Numbers


- name: constant.numeric.yaml
  match: (?:(?:(-\s*)?(\w+\s*(:)))|(-))\s*((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\s*$
  captures:
    '1': {name: punctuation.definition.entry.yaml}
    '2': {name: entity.name.tag.yaml}
    '3': {name: punctuation.separator.key-value.yaml}
    '4': {name: punctuation.definition.entry.yaml}

- name: string.unquoted.yaml
  match: (?:(?:(-\s*)?(\w+\s*(:)))|(-))\s*(?:((")[^"]*("))|((')[^']*('))|([^,{}&#\[\]]+))\s*
  captures:
    '1': {name: punctuation.definition.entry.yaml}
    '2': {name: entity.name.tag.yaml}
    '3': {name: punctuation.separator.key-value.yaml}
    '4': {name: punctuation.definition.entry.yaml}
    '5': {name: string.quoted.double.yaml}
    '6': {name: punctuation.definition.string.begin.yaml}
    '7': {name: punctuation.definition.string.end.yaml}
    '8': {name: string.quoted.single.yaml}
    '9': {name: punctuation.definition.string.begin.yaml}
    '10': {name: punctuation.definition.string.end.yaml}
    '11': {name: string.unquoted.yaml}

- name: constant.other.date.yaml
  match: (?:(?:(-\s*)?(\w+\s*(:)))|(-))\s*([0-9]{4}-[0-9]{2}-[0-9]{2})\s*$
  captures:
    '1': {name: punctuation.definition.entry.yaml}
    '2': {name: entity.name.tag.yaml}
    '3': {name: punctuation.separator.key-value.yaml}
    '4': {name: punctuation.definition.entry.yaml}
- include: '#value'

repository:
  array:
    name: meta.structure.array.json
    begin: \[
    beginCaptures:
      '0': {name: punctuation.definition.array.begin.json}
    end: \]
    endCaptures:
      '0': {name: punctuation.definition.array.end.json}
    patterns:
    - include: '#value'
    - name: punctuation.separator.array.json
      match: ','
    - name: invalid.illegal.expected-array-separator.json
      match: '[^\s\]]'

  comments:
    patterns:
    - name: comment.block.documentation.json
      begin: /\*\*
      end: \*/
      captures:
        '0': {name: punctuation.definition.comment.json}
    - name: comment.block.json
      begin: /\*
      end: \*/
      captures:
        '0': {name: punctuation.definition.comment.json}
    - name: comment.line.double-slash.js
      match: (//).*$\n?
      captures:
        '1': {name: punctuation.definition.comment.json}

  constant:
    name: constant.language.json
    match: \b(?:true|false|null)\b

  number:
    comment: handles integer and decimal numbers
    name: constant.numeric.json
    match: "(?x:         # turn on extended mode\n\t\t\t             -?         #\
      \ an optional minus\n\t\t\t             (?:\n\t\t\t               0        #\
      \ a zero\n\t\t\t               |        # ...or...\n\t\t\t               [1-9]\
      \    # a 1-9 character\n\t\t\t               \\d*      # followed by zero or\
      \ more digits\n\t\t\t             )\n\t\t\t             (?:\n\t\t\t        \
      \       (?:\n\t\t\t                 \\.     # a period\n\t\t\t             \
      \    \\d+    # followed by one or more digits\n\t\t\t               )?\n\t\t\
      \t               (?:\n\t\t\t                 [eE]   # an e character\n\t\t\t\
      \                 [+-]?  # followed by an option +/-\n\t\t\t               \
      \  \\d+    # followed by one or more digits\n\t\t\t               )?       #\
      \ make exponent optional\n\t\t\t             )?         # make decimal portion\
      \ optional\n\t\t\t           )"

  object:
    comment: a JSON object
    name: meta.structure.dictionary.json
    begin: \{
    beginCaptures:
      '0': {name: punctuation.definition.dictionary.begin.json}
    end: \}
    endCaptures:
      '0': {name: punctuation.definition.dictionary.end.json}
    patterns:
    - comment: the JSON object key
      include: '#string'
    - include: '#comments'
    - name: meta.structure.dictionary.value.json
      begin: ':'
      beginCaptures:
        '0': {name: punctuation.separator.dictionary.key-value.json}
      end: (,)|(?=\})
      endCaptures:
        '1': {name: punctuation.separator.dictionary.pair.json}
      patterns:
      - comment: the JSON object value
        include: '#value'
      - name: invalid.illegal.expected-dictionary-separator.json
        match: '[^\s,]'
    - name: invalid.illegal.expected-dictionary-separator.json
      match: '[^\s\}]'

  string:
    name: string.quoted.double.json
    begin: '"'
    beginCaptures:
      '0': {name: punctuation.definition.string.begin.json}
    end: '"'
    endCaptures:
      '0': {name: punctuation.definition.string.end.json}
    patterns:
    - name: constant.character.escape.json
      match: |-
        (?x:                # turn on extended mode
                             \\                # a literal backslash
                             (?:               # ...followed by...
                               ["\\/bfnrt]     # one of these characters
                               |               # ...or...
                               u               # a u
                               [0-9a-fA-F]{4}  # and four hex digits
                             )
                           )
    - name: invalid.illegal.unrecognized-string-escape.json
      match: \\.

  value:
    comment: "the 'value' diagram at http://json.org"
    patterns:
    - include: '#constant'
    - include: '#number'
    - include: '#string'
    - include: '#array'
    - include: '#object'
    - include: '#comments'
foldingStartMarker: |-
  (?x:       # turn on extended mode
                            ^        # a line beginning with
                            \s*      # some optional space
                            [{\[]    # the start of an object or array
                            (?!      # but not followed by
                              .*     # whatever
                              [}\]]  # and the close of an object or array
                              ,?     # an optional comma
                              \s*    # some optional space
                              $      # at the end of the line
                            )
                            |        # ...or...
                            [{\[]    # the start of an object or array
                            \s*      # some optional space
                            $        # at the end of the line
                          )
foldingStopMarker: |-
  (?x:     # turn on extended mode
                           ^      # a line beginning with
                           \s*    # some optional space
                           [}\]]  # and the close of an object or array
                         )
keyEquivalent: ^~J

...
like image 136
Avik Avatar answered Sep 20 '22 18:09

Avik